我刚开始学习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次特快
在此先感谢您的帮助
看来你的'click'变量没有初始化(包含垃圾)。尝试用'cv :: Vec3f BGR = matOriginal.at(点击[0] [1],点击[0] [0]);',你应该检查'点击[0] [0]还是点击[0] [1]'在尝试访问'matOriginal'元素之前超出范围。 –
Jigsore
我认为你需要检查matOriginal的类型(print matOriginal.type())以确保它确实是Vec3f而不是Vec3b。这个简单的事实可能可以解释你所有的问题。 – carlosdc
错误是什么? –