我刚开始学习c ++和OpenCV。我试着编写一个程序,允许我点击一个像素并打印出BGR中的像素值。到目前为止,当我点击时,我的程序返回点击的像素的坐标,但是当我想访问BGR值时,我的程序崩溃了。我正在从我的网络摄像头传输视频作为输入,我编译时没有任何错误。
我在这里已经阅读了很多类似的问题,但我没有找到任何解决方案。
当我包含该行时,我的程序崩溃: “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 Express
提前感谢您的帮助
答案 0 :(得分:0)
好的,这里可能会发生两件不同的事情:
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]);