Ошибка подтверждения OpenCV Ошибка - лучшее решение для обхода объектов Mat? (C ++) - PullRequest
0 голосов
/ 30 августа 2018

Я работал над некоторыми примерами создания детектора движения в C ++ с OpenCV, который рисует прямоугольник вокруг движущегося объекта.

При запуске кода появляется следующая ошибка:

Ошибка OpenCV: ошибка подтверждения <0 <= I && I <vv.size <>> в cv :: InputArray :: getMat , файл C: \ Users \ grapeot \ Source \ opencv \ modules \ core \ src \ matrix.cpp, строка 1192

После некоторых исследований я пришел к выводу, что это, вероятно, связано с циклом cnts (см. Код ниже). В python обход через объект Mat очень прост, но для C ++ это был лучший способ, который я придумал.

Как я могу исправить эту ошибку или, возможно, найти лучшее решение для цикла? (если ошибка связана даже с этой частью)

Вот примеры: Python Tutorial Пример Python Пример C ++

И это мой код: (извините, здесь не удалось правильно отформатировать его)

#include <opencv2/opencv.hpp>
#include <opencv2/video/tracking.hpp>
#include <opencv2/core/ocl.hpp>

using namespace cv;
using namespace std;

int main(int argc, char **argv) {
Mat frame,
    gray,
    frameDelta,
    thresh,
    firstFrame;
vector<vector<Point>> cnts;
Rect rect;
Point pt1, pt2;
VideoCapture cap(0);
String text;

cap >> frame;
cvtColor(frame, firstFrame, COLOR_BGR2GRAY);
GaussianBlur(firstFrame, firstFrame, Size(21, 21), 0, 0);

if (cap.isOpened()) {
    while (true) {

        cap >> frame;

        if (frame.empty()) {
            break;
        }

        text = "No motion detected";

        // convert image to grayscale
        cvtColor(frame, gray, COLOR_BGR2GRAY);

        // blur image to decrease sensitivity of motion detection
        GaussianBlur(gray, gray, Size(21, 21), 0, 0);

        // compare current and previous frame, store result in frameDelta
        absdiff(firstFrame, gray, frameDelta);

        // we only look for differences larger than a certain threshold
        threshold(frameDelta, thresh, 10, 255, THRESH_BINARY);
        dilate(thresh, thresh, Mat());
        findContours(thresh, cnts, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

        for (int i = 0; i < cnts.size(); i++) {
            if (contourArea(cnts[i]) < 500) {
                continue;
            }

            // calculate box surrounding the contours
            rect = boundingRect(cnts);
            pt1.x = rect.x;
            pt1.y = rect.y;
            pt2.x = rect.x + rect.width;
            pt2.y = rect.y + rect.height;

            // draw the box
            rectangle(frame, pt1, pt2, (0, 255, 0), 2);
            text = "Motion detected";

        }

        putText(frame, text, Point(10, 20), FONT_HERSHEY_DUPLEX, 0.45, (0, 0, 255), 2);
        imshow("Bounding Rectangles", frame);
        imshow("delta", frameDelta);

        if (waitKey(1) == 27) {
            break;
        }
    }
}
return 0;
}
...