【发布时间】:2021-09-13 20:16:37
【问题描述】:
我试图在网络摄像头视频上创建一个矩形 ROI。但是这段代码崩溃了
#include "opencv2/opencv.hpp"
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
using namespace cv;
int main(){
VideoCapture cap(0);
if(!cap.isOpened()){
cout << "Error opening video stream or file" << endl;
return -1;
}
Rect Roi(1,1,100,200);
while(1){
Mat frame;
cap >> frame;
frame.copyTo(frame(Roi));
// If the frame is empty, break immediately
if (frame.empty())
break;
// Display the resulting frame
imshow( "Frame", frame );
moveWindow("Frame",500,100);
// Press ESC on keyboard to exit
char c=(char)waitKey(25);
if(c==27)
break;
}
cap.release();
destroyAllWindows();
return 0;
}
// g++ cam_roi.cpp pkg-config --cflags --libs opencv4; ./a.out
错误 ==> [警告:0] 全局 ../modules/videoio/src/cap_gstreamer.cpp (961) 打开 OpenCV | GStreamer 警告:无法查询视频位置:状态=0,值=-1,持续时间=-1 在抛出 'cv::Exception' 的实例后调用终止 什么():OpenCV(4.5.1)../modules/core/src/matrix_wrap.cpp:1188:错误:(-215:断言失败)!fixedSize()|| ((Mat*)obj)->size.operator()() == Size(_cols, _rows) in function 'create'
中止
【问题讨论】:
-
frame.copyTo(frame(Roi));是荒谬的。frame(Roi)是一个较小的区域,它是一个“视图”。您不能复制到不同大小的视图中。您会欣赏完整的答案吗? -
@ChristophRackwitz 请回答,我会接受的
-
这仍然不涉及“绘制”一个矩形(例如使用
cv::rectangle),而是从图像中获取一个子区域。我建议您编辑问题的标题,以便更容易找到内容。