Я работал над некоторыми примерами создания детектора движения в 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;
}