私はビデオを持っています。プログラムが実行されると、ビデオの最初のフレームが画像として取得され、矩形が描画された後、ユーザは画像を右クリックして矩形を確定しなければならない。マウスを右クリックすると画像が消え、ビデオが描画された矩形で再生を開始します。ビデオの矩形からマウスでROIを設定する
私は矩形を完全に描くことができますが、その矩形をROIとして設定することはできません。
私がしたいことは、ROI(Region of Interest)としてその矩形を設定して、そのROIで画像処理を行うことです。私はROIとして描画する矩形を設定することができません。
私はVisual Studio 2010でOpenCVを使用しています。後でこのプログラムをQT作成者に統合しようとします。
ご協力いただければ幸いです。
ありがとうございます。次のように
私の完全なコードは次のとおりです。
#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;
}
あなたがROIとして矩形を設定することができないと言うとき、あなたは、エラーコードを取得する意味ですか?コードはコンパイルされますか? –
正解静止画像を左クリックしたときにエラーが発生しました。 –