Ich habe Video, wenn das Programm ausgeführt wird das erste Bild des Videos wird als ein Bild und der Benutzer darf ein Rechteck auf dem Bild, nachdem das Rechteck gezeichnet wird, zu zeichnen, Der Benutzer muss mit der rechten Maustaste auf das Bild klicken, um das Rechteck zu bestätigen. Wenn die Maus mit der rechten Maustaste geklickt wird, verschwindet das Bild und das Video beginnt mit dem gezeichneten Rechteck zu spielen.Einstellung ROI mit der Maus aus einem Rechteck auf einem Video
Ich kann das Rechteck perfekt zeichnen, aber ich kann dieses Rechteck nicht als ROI festlegen.
Was ich tun möchte, ist dieses Rechteck als Region of Interest (ROI) festlegen, um einige Bildverarbeitung auf dieser ROI zu tun. Ich kann das Rechteck, das ich als ROI zeichne, nicht festlegen.
Ich benutze OpenCV mit Visual Studio 2010. Später werde ich versuchen, dieses Programm in QT Creator zu integrieren.
Jede Hilfe würde geschätzt.
Vielen Dank im Voraus.
Mein vollständiger Code ist wie folgt:
#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;
}
Wenn Sie sagen, Sie nicht in der Lage sind das Rechteck als ROI zu setzen, tun Sie Sie einen Fehlercode erhalten bedeuten? Kompiliert der Code? –
Ja, ich habe einen Fehler erhalten, als ich auf das statische Bild geklickt habe. Es kompiliert korrekt aber –