0

マウスイベントに基づいてフレームに四角形を描画しようとしています。問題は、ビデオがストリーミングされたときにそれを実行できないことです。プログラムがクラッシュするのは私のコードです:

  cv::Rect theBox;
   bool drawing_box = false;

  void draw_box(Mat* frame, cv::Rect rectangle){
cvRectangle( frame, cvPoint(theBox.x, theBox.y), cvPoint   heBox.x+theBox.width,theBox.y+theBox.height),
            cvScalar(0xff,0x00,0x00) );

} void mouse(int イベント, int x, int y ,int フラグ, void* パラメータ){

Mat* image = (Mat*) parameter;

switch( event ){
    case CV_EVENT_MOUSEMOVE: 
        if( drawing_box ){
            theBox.width = x-theBox.x;
            theBox.height = y-theBox.y;
        }
        break;

    case CV_EVENT_LBUTTONDOWN:
        drawing_box = true;
        theBox = cvRect( x, y, 0, 0 );
        break;

    case CV_EVENT_LBUTTONUP:
        drawing_box = false;
        if( theBox.width < 0 ){
            theBox.x += theBox.width;
            theBox.width *= -1;
        }
        if( theBox.height < 0 ){
            theBox.y += theBox.height;
            theBox.height *= -1;
        }
        draw_box( image, theBox );
        //cv::rectangle(parameter, theBox, CV_RGB(255,0,0));
        break;
}

}

int  main(){

    cv::Mat frame;
    int key = 0 ;
    const char* name = "box";
    theBox = Rect(-1,-1,0,0);
    cv::VideoCapture cap(1);

    if (!cap.isOpened()){
        cout<< " capture isn't open " << endl;
        return -1;
    }

    cv::namedWindow(name);

    while (key != 27){

        cap >> frame;
        cv::imshow(name,frame);
        cv::setMouseCallback(name,mouse,&frame);

        key = cv::waitKey(1);
    }

    cv::destroyAllWindows();

return 0;

}

4

1 に答える 1

0

ビデオ ストリーミングが行われているとき、表示が更新されます...同時に、長方形を描画しようとするのは困難です...長方形はマウスの動きの入力に基づいて描画され、マウスの動きは独立しているためです。ストリーミングビデオフレームの...したがって、長方形が上書きされる可能性があります(ただし、クラッシュすることはありません)。ビデオフレーム表示の各反復で、ビデオフレームの上に透明な(マウス移動イベントに基づくサイズ..)画面を描画しようとすることができます...

于 2013-01-10T11:29:00.680 に答える