Установка ROI с мышью из прямоугольника на видео

У меня есть видео, когда программа запускается, первый кадр видео воспринимается как изображение, и пользователю разрешено рисовать прямоугольник на изображении, после рисования прямоугольника пользователь должен щелкнуть правой кнопкой мыши по изображению, чтобы подтвердить прямоугольник. Когда мышь правой кнопкой мыши на изображении исчезает, и видео начинает играть с рисованным прямоугольником на нем.

Я умею рисовать прямоугольник отлично, но я не могу установить этот прямоугольник как ROI.

То, что я хочу сделать, – это установить этот прямоугольник как область интереса (ROI), чтобы сделать некоторую обработку изображения в этой ROI. Я не могу установить прямоугольник, который я рисую как ROI.

Я использую OpenCV с Visual Studio 2010. Позже я попытаюсь интегрировать эту программу в создателя QT.

Любая помощь будет оценена по достоинству.

Заранее спасибо.

Мой полный код выглядит следующим образом:

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

Ты был почти там. Одна проблема: case CV_EVENT_RBUTTONUP должен быть case CV_EVENT_RBUTTONUP , и я бы также добавил break по default .

Следующий код устанавливает ROI, выполняет на нем простую обработку оттенков серого, а затем копирует обработанный ROI обратно в исходное изображение.

Для тестирования я изменил свой код, чтобы использовать мою камеру вместо загрузки файла.

Выход :

введите описание изображения здесь

Код :

 #include  #include  #include  #include  #include  #include  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; } в #include  #include  #include  #include  #include  #include  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; } 
  • Как поворачивать изображения JPEG на основе метаданных ориентации?
  • Очень быстро memcpy для обработки изображений?
  • Как гауссовское размытие изображения без использования встроенных функций gaussian?
  • Как сделать fadein изображения на экране активности Android?
  • OpenCv 2.3 C - Как изолировать объект внутри изображения
  • подключенных компонентов в OpenCV
  • масштаб и rotation Соответствие шаблонов
  • Качество сохраненного JPG в C #
  • Перестановка шумовой монеты в круглую форму
  • Как обрезать изображение с помощью C #?
  • Обнаружение горизонтальной линии с помощью OpenCV
  • Давайте будем гением компьютера.