Невозможно нарисовать прямоугольник поверх видео с веб-камеры OpenCV C++

avatar
Monisha yadav
1 июля 2021 в 19:00
146
1
0

Я пытаюсь создать прямоугольную область интереса поверх видео с веб-камеры. Но этот код дает сбой

#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: невозможно запросить позицию видео: статус=0, значение=-1, продолжительность=-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'

Прервано

Источник
Christoph Rackwitz
1 июля 2021 в 19:04
0

frame.copyTo(frame(Roi)); бессмысленно. frame(Roi) — это меньшая область, и это «представление». вы не можете копировать в представления с другим размером. Вы оцените полный ответ?

Monisha yadav
1 июля 2021 в 19:05
0

@ChristophRackwitz Пожалуйста, ответьте, я приму это

Christoph Rackwitz
1 июля 2021 в 20:50
0

это по-прежнему не включает «рисование» прямоугольника (например, с помощью cv::rectangle), а берет подобласть из изображения. Я бы рекомендовал отредактировать заголовок вашего вопроса, чтобы облегчить поиск контента.

Ответы (1)

avatar
Christoph Rackwitz
1 июля 2021 в 19:09
0

основная проблема

(-215:Assertion failed) !fixedSize() || ((Mat*)obj)->size.operator()() == Size(_cols, _rows) in function 'create'

(строка gstreamer это просто предупреждение)

эта ошибка исходит из этой строки (это не очевидно, но copyto включает вызов Mat::create):

    frame.copyTo(frame(Roi));

copyTo получает мат назначения в качестве аргумента. в некоторых случаях он может изменить размер места назначения.

frame(Roi) — это «представление» в frame, и размеры представлений нельзя изменить, т. е. они имеют «фиксированный размер».

Кажется, вы хотите взять этот субрегион и вернуть его в кадр.

если бы эта строка кода работала, она делала бы обратное, то есть помещала бы данные из целого frame в свою подобласть...

просто сделайте это:

frame = frame(Roi);

это сохранит вид. вы можете использовать его как обычно. все данные frame будут жить до тех пор, пока представление.

данные представления не будут непрерывными, если вас это беспокоит.

чтобы "исправить" это, вы можете создать копию, которая будет непрерывной:

frame = frame(Roi).clone();