尝试访问 OpenCV 中的像素值时出错

Error when trying to access a pixel value in OpenCV

本文关键字:像素 出错 访问 OpenCV      更新时间:2023-10-16

我刚开始学习c++和OpenCV。我尝试编写一个程序,允许我单击像素并在BGR中打印出像素值。到目前为止,当我单击时,我的程序返回单击像素的坐标,但是当我想访问 BGR 值时,我的程序崩溃了。我正在从网络摄像头流式传输视频作为输入,并且在编译时没有收到任何错误。

我一直在这里阅读很多类似的问题,但我没有找到任何解决方案。

当我包含以下行时,我的程序崩溃:"cv::Vec3f BGR = matOriginal.at(

click[0][0],click[0][1]);"

我的程序的其余部分如下:

int click[1][2];
void mouseEvent(int Event, int x, int y, int flags, void* param)
{
if(Event == CV_EVENT_LBUTTONDOWN)
{
    printf("Valgt pixel: [%d,%d] n ",x,y);
    click[0][0] = x;
    click[0][1] = y;
}
}
int main()
{
VideoCapture capWebcam(0);
if(capWebcam.isOpened() == false)
{
    printf("Error: capWebcam not accessed successfully n");
    return(1);
}
Mat matOriginal;
char charCheckForEscKey=0;
while(charCheckForEscKey !=27)
{
    if(capWebcam.read(matOriginal) == NULL)
    {
        printf("Error: Frame not readn n");
        break;
    }
    cv::imshow("Original",matOriginal);
    setMouseCallback("Original",mouseEvent,0);
    // Print BGR-value when mouseclick
    if(click[0][0]>0 && click[0][1]>0)
    {
    cv::Vec3f BGR = matOriginal.at<cv::Vec3f>(click[0][0],click[0][1]); // When this statement is included, I get an ERROR
    double B=BGR[0];    // B
    double G=BGR[1];    // G
    double R=BGR[2];    // R

    click[0][0] = 0; // Resetting the click-matrix
    click[0][1] = 0;
    }
    charCheckForEscKey = cv::waitKey(10);
}
return(0);

}

我正在使用Microsoft Visual C++ 2013 Express

提前感谢您的帮助

好的,这里可能发生两件不同的事情:

  • 发生崩溃的原因是click未初始化

当程序的执行到达 while 循环并且用户没有按下鼠标按钮时,无法判断click存储了哪些值,因为它们很可能是内存中的垃圾。

这意味着当你第一次运行编程时,click可能会存储大于matOriginal维度的值,从而使你因试图访问不存在的索引而崩溃。

始终初始化变量!

int main()
{
    click[0][0] = -1;
    click[0][1] = -1;
    // ...
}

我刚才所说的可以通过在访问它们之前将这些值打印到屏幕上来测试:

std::cout << "X: " << click[0][0] << " Y: " << click[0][1] << std::endl;
cv::Vec3f BGR = matOriginal.at<cv::Vec3f>(click[0][0], click[0][1]);
  • 发生崩溃是因为cv::Mat期望 X,Y(行,列)值的顺序相反(列,行):

我认为这很可能是问题的原因。尝试:

cv::Vec3f BGR = matOriginal.at<cv::Vec3f>(click[0][1], click[0][0]);