繁体   English   中英

Mat中的OpenCV C++错误:at

[英]OpenCV C++ error in Mat:at

我是 OpenCV 和 C++ 的新手。 我将通过网络摄像头导入帧并查找其中每个像素的值来进行实时图像处理。 以下代码在我的代码中运行良好,每当我按下一个键时,它就会中断循环并找到图像中的第一个黑色像素。 但是如果我删除了在无限循环中查找像素的第一个值的 If 语句,它会给我这个错误:

OpenCV 错误:断言失败 ((unsigned)i0 < (unsigned)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;
}

如果有人帮助我解决这个问题,我将不胜感激。 谢谢。

更有效和正确的方法是像这样访问每个像素:

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)
            ....
    }
}

我解决了这个问题。 我的问题在于声明“src”矩阵。 我用CV_8UC1然后我用它代替CV_8U和问题就解决了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM