Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

You should set roi for each frame, also you have problems with 'q' key in your code. Please don't release frame IplImage, you should not do it, when you using capturing.

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

IplImage* frame, * img1;
CvPoint point;
int drag = 0;
CvCapture *capture = 0;
int key = 0;
CvRect rect;

void mouseHandler(int event, int x, int y, int flags, void* param)
{
    /* user press left button */
    if (event == CV_EVENT_LBUTTONDOWN && !drag)
    {
        point = cvPoint(x, y);
        drag = 1;
    }
    /* user drag the mouse */
    if (event == CV_EVENT_MOUSEMOVE && drag)
    {
        img1 = cvCloneImage(frame);
        cvRectangle(img1,point,cvPoint(x, y),CV_RGB(255, 0, 0),1,8,0);
        cvShowImage("result", img1);
    }
    /* user release left button */
    if (event == CV_EVENT_LBUTTONUP && drag)
    {
        rect = cvRect(point.x,point.y,x-point.x,y-point.y);
        cvSetImageROI(frame,rect);
        cvShowImage("result", frame);
        drag = 0;
    }

    /* user click right button: reset all */
    if (event == CV_EVENT_RBUTTONUP)
    {
        drag = 0;
    }
}

int main(int argc, char *argv[])
{
    capture = cvCaptureFromCAM( 0 ); /*here when I write cvCaptureFromAVI it does not work */
    if ( !capture ) {
        printf("Cannot open initialize webcam!\n" );
        exit(0);
    }

    /* create a window for the video */ 
    cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );

    while( key != 'q' )
    {
        frame = cvQueryFrame( capture );
        if (rect.width>0)
            cvSetImageROI(frame,rect);
        cvSetMouseCallback("result", mouseHandler, NULL);
        key = cvWaitKey(10);
        if( (char) key== 'r' ){ rect = cvRect(0,0,0,0); cvResetImageROI(frame);}
        cvShowImage("result", frame);
    }
    cvDestroyWindow("result");
    cvReleaseImage(&img1);
    return 0;
}

You should set roi for each frame, also you have problems with 'q' key in your code. Please don't release frame IplImage, you should not do it, when you using capturing.

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

IplImage* frame, * img1;
CvPoint point;
int drag = 0;
CvCapture *capture = 0;
int key = 0;
CvRect rect;

void mouseHandler(int event, int x, int y, int flags, void* param)
{
    /* user press left button */
    if (event == CV_EVENT_LBUTTONDOWN && !drag)
    {
        point = cvPoint(x, y);
        drag = 1;
    }
    /* user drag the mouse */
    if (event == CV_EVENT_MOUSEMOVE && drag)
    {
        img1 = cvCloneImage(frame);
        cvRectangle(img1,point,cvPoint(x, y),CV_RGB(255, 0, 0),1,8,0);
        cvShowImage("result", img1);
    }
    /* user release left button */
    if (event == CV_EVENT_LBUTTONUP && drag)
    {
        rect = cvRect(point.x,point.y,x-point.x,y-point.y);
        cvSetImageROI(frame,rect);
        cvShowImage("result", frame);
        drag = 0;
    }

    /* user click right button: reset all */
    if (event == CV_EVENT_RBUTTONUP)
    {
        drag = 0;
    }
}

int main(int argc, char *argv[])
{
    capture = cvCaptureFromCAM( 0 ); /*here when I write cvCaptureFromAVI it does not work */
     if ( !capture ) {
        printf("Cannot open initialize webcam!\n" );
        exit(0);
    }

    /* create a window for the video */ 
    cvNamedWindow( "result", CV_WINDOW_AUTOSIZE );

    while( key != 'q' )
    {
        frame = cvQueryFrame( capture );
        if (rect.width>0)
            cvSetImageROI(frame,rect);
        cvSetMouseCallback("result", mouseHandler, NULL);
        key = cvWaitKey(10);
        if( (char) key== 'r' ){ rect = cvRect(0,0,0,0); cvResetImageROI(frame);}
        cvShowImage("result", frame);
    }
    cvDestroyWindow("result");
    cvReleaseImage(&img1);
    return 0;
}