实时摄像机上的OpenCV ROI

时间:2017-04-24 21:08:17

标签: c++ opencv roi

我正在尝试在实时相机中设置ROI并在ROI中复制图片。 但是,我尝试了许多来自Internet的方法,但它仍然没有成功。 我的部分代码如下所示:



 while(!protonect_shutdown)
    {
        listener.waitForNewFrame(frames);      
        libfreenect2::Frame *ir = frames[libfreenect2::Frame::Ir];
        //! [loop start]

     
        cv::Mat(ir->height, ir->width, CV_32FC1, ir->data).copyTo(irmat);
      
 
	    Mat img = imread("button.png");

	    cv::Rect r(1,1,100,200);
		
	   cv::Mat dstroi = img(Rect(0,0,r.width,r.height));
	   irmat(r).convertTo(dstroi, dstroi.type(), 1, 0);
  	   cv::imshow("ir", irmat / 4500.0f);
  
       int key = cv::waitKey(1);

       protonect_shutdown = protonect_shutdown || (key > 0 && ((key & 0xFF) == 27)); 

        listener.release(frames);
    }




我的实时相机可以正常显示视频。我的程序中没有错误,但图片无法在ROI中显示。 有没有人有想法? 任何帮助都很感激。

1 个答案:

答案 0 :(得分:0)

我希望我理解你的问题,你想要一个像这样的输出:

enter image description here

我在视频输入上创建了一个大小为100x200的矩形,并在该矩形中显示图像。

以下是代码:

int main()
{
    Mat frame,overlayFrame;

    VideoCapture cap("video.avi");//use 0 for webcam 
    overlayFrame=imread("picture.jpg");

    if (!cap.isOpened())
    {
        cout << "Could not capture video";
        return -1;
    }

    Rect roi(1,1,100,200);//creating a rectangle of size 100x200 at point (1,1) on the videofeed

    namedWindow("CameraFeed");

    while ((cap.get(CV_CAP_PROP_POS_FRAMES) + 1) < cap.get(CV_CAP_PROP_FRAME_COUNT))
    {
        cap.read(frame);

        resize(overlayFrame, overlayFrame, resize(overlayFrame, overlayFrame, Size(roi.width, roi.height));//changing the size of the image to fit in the roi

        overlayFrame.copyTo(frame(roi));//copying the picture to the roi

        imshow("CameraFeed", frame);

        if (waitKey(27) >= 0)
            break;
    }
    destroyAllWindows;
    return 0;
}