Ошибка OpenCV C ++ в Mat: at

Я новичок в OpenCV и C ++. Я собираюсь выполнить обработку изображений в реальном времени с импортом кадра по веб-камере и нахождением значения каждого пикселя в нем.
Следующий код прекрасно работает в моем коде, всякий раз, когда я нажимаю клавишу, она прерывает цикл и находит первый черный пиксель в изображении. но если я удаляю оператор If для нахождения первого значения пикселя в бесконечном цикле, это дает мне эту ошибку:

Ошибка OpenCV: утверждение не выполнено ((без знака) i0 < (без знака) size.p [0]) в cv :: Mat :: at, файл c: \ opencv \ build \ include \ opencv2 \ core \ mat.inl.hpp, строка 917>

Вот некоторая часть моего кода:

#include "opencv2/imgproc/imgproc.hpp"#include "opencv2/imgcodecs.hpp"#include "opencv2/highgui/highgui.hpp"#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <windows.h>

using namespace cv;
using namespace std;
/// Global variables
int maxRepeating(int* arr, int n, int k);

int main(int, char** argv)
{
Mat frame, src1;
Mat bgr_image;
Mat dst(frame.size(), CV_8UC1, cv::Scalar(0));
Mat src(frame.size(), CV_8UC1, cv::Scalar(0));
/// Load an image
VideoCapture cap(1); // open the default camera
if (!cap.isOpened())  // check if we succeeded
return -1;
//  namedWindow("src", 1);
cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
capturing:
for (;;)
{
cap >> frame; // get a new frame from camera
if (frame.empty()) return 0;
cvtColor(frame, src1, CV_BGR2GRAY);
imshow("src", src1);
if (waitKey(30) >= 0) break;  //if I remove this line and put the following two lines I get the error
// waitKey(10);
// break;
}
int operation = 4;
double morph_size = 2;
//preprocessing
//...
Mat element = getStructuringElement(MORPH_RECT, Size(2 * morph_size + 1, 2 * morph_size + 1), Point(-1, -1));
/// Apply the specified morphology operation
morphologyEx(src1, dst, operation, element);
threshold(dst, src, 128, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);
int i = 0;
int j = 0;
int p = 0;
int q = 0;
int flag = 0;
int cnt = 0;
int cm = 0;
int flagold = 10;
int f0 = 1, f1 = 1, f2 = 1, f3 = 1, f4 = 1, f5 = 1, f6 = 1, f7 = 1;
int chain[100000];
std::fill(chain, chain + size(chain), 9);
int val = 0;
for (i = 0; i < src.rows; i++) {
for (j = 0; j < src.cols; j++) {
val = src.at<uchar>(i, j); //I think problem is with this line
if (val == 0) {
cout << "fist pixel found!";
cout << "i=" << i << "j=" << j << endl;
p = i;
q = j;
goto st;
}
}
}
st:
//some stuff...
goto capturing;
}

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

-1

Решение

Более эффективным и правильным способом было бы получить доступ к каждому пикселю следующим образом:

for(int i = 0; i < src.rows; i++)
{
const uchar* row = src.ptr<uchar>(i);
for(int j = 0; j < src.cols; j++)
{
if(row[j] == 0)
....
}
}
2

Другие решения

Я решил проблему. Моя проблема была в объявлении матрицы «src». я использовал CV_8UC1 Затем я заменил его CV_8Uи проблема решена.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector