2013-11-15 90 views
1

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

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

我的程序崩溃时,包括行: “cv :: Vec3f BGR = matOriginal.at(单击[0] [0],单击[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 read\n \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次特快

在此先感谢您的帮助

+0

看来你的'click'变量没有初始化(包含垃圾)。尝试用'cv :: Vec3f BGR = matOriginal.at (点击[0] [1],点击[0] [0]);',你应该检查'点击[0] [0]还是点击[0] [1]'在尝试访问'matOriginal'元素之前超出范围。 – Jigsore

+0

我认为你需要检查matOriginal的类型(print matOriginal.type())以确保它确实是Vec3f而不是Vec3b。这个简单的事实可能可以解释你所有的问题。 – carlosdc

+0

错误是什么? –

回答

0

好,两种不同的事情可能会发生在这里:

  • 崩溃是因为click未初始化

当你的程序的执行达到循环,并且用户还没有按下鼠标按钮,有没有办法告诉哪些值由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(行,列)值以相反顺序(列,行)

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

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