Configuración de ROI con el mouse desde un rectángulo en un video

Tengo un video, cuando se ejecuta el programa, el primer fotograma del video se toma como una imagen y el usuario puede dibujar un rectángulo en la imagen. Después de dibujar el rectángulo, el usuario debe hacer clic derecho en la imagen para confirmar el rectángulo. Cuando el mouse hace clic con el botón derecho, la imagen desaparece y el video comienza a reproducirse con el rectángulo dibujado en él.

Soy capaz de dibujar el rectángulo perfectamente pero no puedo establecer ese rectángulo como ROI.

Lo que quiero hacer es configurar ese rectángulo como Región de interés (ROI) para realizar un procesamiento de imágenes en ese ROI. No puedo establecer el rectángulo que dibujo como ROI.

Estoy utilizando OpenCV con Visual Studio 2010. Más adelante intentaré integrar este programa en el creador de QT.

Cualquier ayuda sería apreciada.

Gracias por adelantado.

Mi código completo es el siguiente:

#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;
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta