2012-06-04 6 views
5

मेरे पास वीडियो है, जब प्रोग्राम चलाया जाता है तो वीडियो का पहला फ्रेम एक छवि के रूप में लिया जाता है और उपयोगकर्ता को आयताकार के बाद छवि पर एक आयत खींचने की अनुमति दी जाती है, आयत की पुष्टि करने के लिए उपयोगकर्ता को छवि पर राइट क्लिक करना होगा। जब माउस राइट-क्लिक किया गया तो छवि गायब हो जाती है और वीडियो उस पर खींचे गए आयत के साथ खेलना शुरू कर देता है।वीडियो पर एक आयत से माउस के साथ आरओआई सेट करना

मैं आयताकार पूरी तरह से आकर्षित करने में सक्षम हूं लेकिन मैं उस आयत को आरओआई के रूप में सेट नहीं कर सकता।

मैं जो करना चाहता हूं वह उस आयत को आरओआई पर कुछ छवि प्रसंस्करण करने के लिए ब्याज क्षेत्र (आरओआई) के रूप में सेट करना है। मैं आयताकार सेट करने में असमर्थ हूं जिसे मैं आरओआई के रूप में आकर्षित करता हूं।

मैं विजुअल स्टूडियो 2010 के साथ ओपनसीवी का उपयोग कर रहा हूं। बाद में मैं इस कार्यक्रम को क्यूटी निर्माता में एकीकृत करने की कोशिश करूंगा।

किसी भी मदद की सराहना की जाएगी।

अग्रिम धन्यवाद।

#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
#include <string.h> 
#include<opencv2\opencv.hpp> 
#include <opencv2\highgui\highgui.hpp> 
#include <opencv/highgui.h> 
#include <opencv/cxcore.h> 
#include <opencv\cvaux.h> 

using namespace cv; 
using namespace std; 
void my_mouse_callback(int event, int x, int y, int flags, void* param); 
bool destroy=false; 
CvRect box; 
IplImage* image; 
IplImage* frame2; 
bool drawing_box = false; 

void draw_box(IplImage* img, CvRect rect) 
{ 
cvRectangle(img, cvPoint(box.x, box.y), cvPoint(box.x+box.width,box.y+box.height), 
      cvScalar(0,0,255) ,2); 

CvRect rect2=cvRect(box.x,box.y,box.width,box.height); 
//cvSetImageROI(image, rect2); //here I wanted to set the drawn rect as ROI 
} 

// Implement mouse callback 
void my_mouse_callback(int event, int x, int y, int flags, void* param){ 
IplImage* image = (IplImage*) param; 

switch(event){ 
    case CV_EVENT_MOUSEMOVE: 
     if(drawing_box) 
     { 
      box.width = x-box.x; 
      box.height = y-box.y; 
     } 
     break; 

    case CV_EVENT_LBUTTONDOWN: 
     drawing_box = true; 
     box = cvRect(x, y, 0, 0); 
     break; 

    case CV_EVENT_LBUTTONUP: 
     drawing_box = false; 
     if(box.width < 0) 
     { 
      box.x += box.width; 
      box.width *= -1; 
     } 
     if(box.height < 0) 
     { 
      box.y += box.height; 
      box.height *= -1; 
     } 
     draw_box(image, box); 
     break; 
    case CV_EVENT_RBUTTONUP: 
     destroy=true; 
    } 
} 

int main() 
{ 
    const char* name = "Box Example"; 
    cvNamedWindow(name); 

    box = cvRect(0,0,1,1); 

    CvCapture* capture = cvCreateFileCapture("C:\\video.mp4"); 
    image = cvQueryFrame(capture); 

    IplImage* temp = cvCloneImage(image); 
// Set up the callback 
    cvSetMouseCallback(name, my_mouse_callback, (void*) image); 


//IplImage *img2 = cvCreateImage(cvGetSize(temp),temp->depth,temp->nChannels); 

//cvNot(temp,temp); 
    /* copy subimage */ 
    //cvCopy(temp, temp, NULL); 

    // Main loop 
    while(1) 
{ 
    if(destroy) {cvDestroyWindow(name); break;} 
    cvCopyImage(image, temp); 
    if(drawing_box) 
     draw_box(temp, box); 
    cvMoveWindow(name, 200, 100); 
    cvShowImage(name, temp); 

    if(cvWaitKey(15)==27) 
     break; 
} 

//cvReleaseImage(&image); 
    cvReleaseImage(&temp); 
cvDestroyWindow(name); 

cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE); 
    cvMoveWindow("Example2", 150, 150); 


    while(1) 
    { 
frame2 = cvQueryFrame(capture); 
draw_box(frame2,box); 
    if(!frame2) break; 
     cvShowImage("Example2", frame2); 
     char c = cvWaitKey(33); 
    if(c == 27) break; 
    } 
cvReleaseCapture(&capture); 
cvDestroyWindow("Example2"); 
    return 0; 
} 
+0

जब आप कहते हैं कि तुम लागत पर लाभ के रूप में आयत सेट करने में असमर्थ हैं, तो आप क्या मतलब है आप एक त्रुटि कोड प्राप्त? कोड संकलित करता है? –

+0

हाँ जब मैंने स्थैतिक छवि को बायाँ-क्लिक किया तो मुझे एक त्रुटि मिली। यह सही ढंग से संकलित किया गया है हालांकि –

उत्तर

18

आपने लगभग थे:

मेरा पूरा कोड इस प्रकार है। हालांकि एक समस्या: case CV_EVENT_RBUTTONUP को break की आवश्यकता है, और मैं 10 पर break भी जोड़ूंगा।

निम्नलिखित कोड आरओआई सेट करता है, उस पर एक सरल ग्रेस्केल प्रसंस्करण करता है और फिर संसाधित आरओआई को मूल छवि पर वापस कॉपी करता है।

परीक्षण उद्देश्यों के लिए मैंने फ़ाइल लोड करने के बजाय अपने कैमरे का उपयोग करने के लिए अपना कोड बदल दिया।

आउटपुट:

enter image description here

कोड:

#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
#include <string.h> 

#include <cv.h> 
#include <highgui.h> 

using namespace cv; 
using namespace std; 

void my_mouse_callback(int event, int x, int y, int flags, void* param); 

bool destroy=false; 
CvRect box; 
bool drawing_box = false; 

void draw_box(IplImage* img, CvRect rect) 
{ 
    cvRectangle(img, cvPoint(box.x, box.y), cvPoint(box.x+box.width,box.y+box.height), 
       cvScalar(0,0,255) ,2); 

    CvRect rect2=cvRect(box.x,box.y,box.width,box.height); 
    //cvSetImageROI(image, rect2); //here I wanted to set the drawn rect as ROI 
} 

// Implement mouse callback 
void my_mouse_callback(int event, int x, int y, int flags, void* param) 
{ 
    IplImage* frame = (IplImage*) param; 

    switch(event) 
    { 
     case CV_EVENT_MOUSEMOVE: 
     { 
      if(drawing_box) 
      { 
       box.width = x-box.x; 
       box.height = y-box.y; 
      } 
     } 
     break; 

     case CV_EVENT_LBUTTONDOWN: 
     { 
      drawing_box = true; 
      box = cvRect(x, y, 0, 0); 
     } 
     break; 

     case CV_EVENT_LBUTTONUP: 
     { 
      drawing_box = false; 
      if(box.width < 0) 
      { 
       box.x += box.width; 
       box.width *= -1; 
      } 

      if(box.height < 0) 
      { 
       box.y += box.height; 
       box.height *= -1; 
      } 

      draw_box(frame, box); 
     } 
     break; 

     case CV_EVENT_RBUTTONUP: 
     { 
      destroy=true; 
     } 
     break; 

     default: 
     break; 
    } 
} 

int main() 
{ 
    const char* name = "Box Example"; 
    cvNamedWindow(name); 
    box = cvRect(0,0,1,1); 

    CvCapture* capture = cvCaptureFromCAM(0); 
    if (!capture) 
    { 
    printf("!!! Failed cvCaptureFromCAM\n"); 
    return 1; 
    } 

    IplImage* image = cvQueryFrame(capture); 
    if (!image) 
    { 
    printf("!!! Failed cvQueryFrame #1\n"); 
    return 2; 
    } 

    IplImage* temp = cvCloneImage(image); 

    // Set up the callback 
    cvSetMouseCallback(name, my_mouse_callback, (void*) image); 

    // Main loop 
    while(1) 
    { 
    if (destroy) 
    { 
     cvDestroyWindow(name); break; 
    } 
    cvCopyImage(image, temp); 

    if (drawing_box) 
     draw_box(temp, box); 

    cvMoveWindow(name, 200, 100); 
    cvShowImage(name, temp); 

    if (cvWaitKey(15) == 27) 
     break; 
    } 

    cvReleaseImage(&temp); 
    cvDestroyWindow(name); 

    cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE); 
    cvMoveWindow("Example2", 150, 150); 

    // Retrieve a single frame from the device and set the ROI 
    IplImage* vid_frame = cvQueryFrame(capture); 
    if (!vid_frame) 
    { 
    printf("!!! Failed cvQueryFrame #2\n"); 
    return 2; 
    } 

    cvSetImageROI(vid_frame, box); 

    // Allocate space for a single-channel ROI (to store grayscale frames) 
    IplImage* gray_roi = cvCreateImage(cvSize(box.width, box.height), IPL_DEPTH_8U, 1); 
    IplImage* rgb_roi = cvCreateImage(cvSize(box.width, box.height), IPL_DEPTH_8U, 3); 

    while(1) 
    { 
    if (!vid_frame) 
    { 
     vid_frame = cvQueryFrame(capture); 
     if (!vid_frame) 
     { 
      printf("!!! Failed cvQueryFrame #3\n"); 
      break; 
     } 
    } 

    draw_box(vid_frame, box); 

    // Set ROI and perform some processing (in this case, converting the ROI to grayscale) 
    cvSetImageROI(vid_frame, box); 
    cvCvtColor(vid_frame, gray_roi, CV_BGR2GRAY); 
     //cvShowImage("Example2", gray_roi); 

    /* At this point gray_roi has the size of thei ROI and contains the processed image. 
    * For fun, we copy the processed image back to the original image and display it on the screen! 
    */ 
    cvCvtColor(gray_roi, rgb_roi, CV_GRAY2BGR); 

    // As the ROI is still set, cvCopy is affected by it 
    cvCopy(rgb_roi, vid_frame, NULL); 

    // Now reset the ROI so cvShowImage displays the full image 
    cvResetImageROI(vid_frame); 
    cvShowImage("Example2", vid_frame); 

    char c = cvWaitKey(33); 
    if(c == 27) break; 

    vid_frame = NULL; 
    } 
    cvSaveImage("processed.jpg", vid_frame); 

    cvReleaseImage(&gray_roi); 
    cvReleaseImage(&rgb_roi); 
    cvReleaseCapture(&capture); 
    cvDestroyWindow("Example2"); 

    return 0; 
} 
+1

** कार्लफिलिप आपको बहुत धन्यवाद। तुमने मुझे सही पाया मैं क्या चाहता था। दोबारा धन्यवाद :) –

+0

अब मैं 1 से अधिक आरओआई दर्ज करने के लिए कोड संपादित करने की कोशिश कर रहा हूं। जैसा कि आप जानते हैं मेरा कोड केवल एक आरओआई स्वीकार करता है। कोई विचार मैं यह कैसे कर सकता हूं? –

+0

इस समय नहीं, लेकिन आगे बढ़ें और इसे स्वयं आज़माएं। अगर आपको कोई समस्या आती है और एक नया सवाल पूछता है और ट्विटर पर मुझे सूचित करता है तो मैं इसे देख सकता हूं। सौभाग्य। – karlphillip

संबंधित मुद्दे