尝试访问 OpenCV 中的像素值时出错
Error when trying to access a pixel value in OpenCV
我刚开始学习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]);
相关文章:
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何在24位SDL_Surface上设置像素的颜色
- 如何从SDL_Surface获取特定像素的颜色
- 如何将CMSampleBufferRef/CIImage/UIImage转换为像素,例如uint8_t[]
- 在C++中查找像素 RGB 数据的最快方法是什么?
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 如何使用 sdl2 快速绘制像素网格?
- 如何在C++中进行像素操作? - Linux
- 他们如何将红外锁定像素转换为镜头前方 1m 的正常平面上的位置
- 访问随机图像像素的快速方法,最多一次
- OpenCV 像素访问点与 at() - 不同的值
- 如何使用 freetype2 访问单色位图中的像素状态
- 尝试渲染像素坐标时,简单线条渲染失败
- 计算另一个图像像素满足条件的像素值的平均值
- 如何返回定义良好的内存部分?例如来自图像数据的像素的颜色值
- 在Qt-cpp中通过像素获取QString的子字符串
- 尝试访问 OpenCV 中的像素值时出错
- 使用OGR判断像素中心是否在多边形内时出错