无法在网络摄像头视频 OpenCV C++ 上绘制矩形
Unable to draw rectangle over webcam video OpenCV C++
我正在尝试在网络摄像头视频上创建一个矩形 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
错误==>
[ WARN:0] 全局 ../modules/videoio/src/cap_gstreamer.cpp (961) 打开 OpenCV | GStreamer 警告:无法查询视频位置:status=0,value=-1,duration=-1
在抛出 'cv::Exception' 的实例后调用终止
what(): OpenCV(4.5.1) ../modules/core/src/matrix_wrap.cpp:1188: 错误: (-215:断言失败)!fixedSize() || ((Mat*)obj)->size.operator()() == Size(_cols, _rows) 函数 'create'
已中止
核心问题是
(-215:Assertion failed) !fixedSize() || ((Mat*)obj)->size.operator()() == Size(_cols, _rows) in function 'create'
(gstreamer 行只是一个警告)
此错误来自该行(不明显,但 copyto
涉及 Mat::create
调用):
frame.copyTo(frame(Roi));
copyTo
获取目标 Mat 作为参数。它可以在某些情况下调整目标的大小。
frame(Roi)
是 frame
的“视图”,并且视图不能调整大小,即它们是“固定大小”。
您似乎想要获取该子区域并将其放回框架中。
如果那行代码有效,它会做相反的事情,即将整个 frame
的数据放入它自己的一个子区域中...
只需这样做:
frame = frame(Roi);
这将保留视图。你可以像往常一样使用它。 frame
的全部数据将与视图一样长。
视图的数据将不连续,如果这是一个问题。
要“解决”这个问题,您可以创建一个连续的副本:
frame = frame(Roi).clone();
我正在尝试在网络摄像头视频上创建一个矩形 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
错误==> [ WARN:0] 全局 ../modules/videoio/src/cap_gstreamer.cpp (961) 打开 OpenCV | GStreamer 警告:无法查询视频位置:status=0,value=-1,duration=-1 在抛出 'cv::Exception' 的实例后调用终止 what(): OpenCV(4.5.1) ../modules/core/src/matrix_wrap.cpp:1188: 错误: (-215:断言失败)!fixedSize() || ((Mat*)obj)->size.operator()() == Size(_cols, _rows) 函数 'create'
已中止
核心问题是
(-215:Assertion failed) !fixedSize() || ((Mat*)obj)->size.operator()() == Size(_cols, _rows) in function 'create'
(gstreamer 行只是一个警告)
此错误来自该行(不明显,但 copyto
涉及 Mat::create
调用):
frame.copyTo(frame(Roi));
copyTo
获取目标 Mat 作为参数。它可以在某些情况下调整目标的大小。
frame(Roi)
是 frame
的“视图”,并且视图不能调整大小,即它们是“固定大小”。
您似乎想要获取该子区域并将其放回框架中。
如果那行代码有效,它会做相反的事情,即将整个 frame
的数据放入它自己的一个子区域中...
只需这样做:
frame = frame(Roi);
这将保留视图。你可以像往常一样使用它。 frame
的全部数据将与视图一样长。
视图的数据将不连续,如果这是一个问题。
要“解决”这个问题,您可以创建一个连续的副本:
frame = frame(Roi).clone();