【问题标题】:Unable to draw rectangle over webcam video OpenCV C++无法在网络摄像头视频 OpenCV C++ 上绘制矩形
【发布时间】: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),而是从图像中获取一个子区域。我建议您编辑问题的标题,以便更容易找到内容。

标签: c++ opencv video roi


【解决方案1】:

核心问题是

(-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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多