在opencv中使用Mat::at(i,j)用于二维Mat对象
Using Mat::at(i,j) in opencv for a 2-D Mat object
我使用的是Ubuntu 12.04和OpenCV 2
我写了下面的代码:IplImage* img =0;
img = cvLoadImage("nature.jpg");
if(img != 0)
{
Mat Img_mat(img);
std::vector<Mat> RGB;
split(Img_mat, RGB);
int data = (RGB[0]).at<int>(i,j)); /*Where i, j are inside the bounds of the matrix size .. i have checked this*/
}
问题是我在数据变量中得到负值和非常大的值。我想我在什么地方犯了错误。你能指出来吗?
我一直在看文档(我还没有完全看完)。它相当大。)但据我所知,这应该行得通。但事实并非如此。这里出了什么问题?
Img_mat
为3通道图像。每个通道由数据类型为uchar
的像素值组成。因此,对于split(Img_mat, BGR)
, Img_mat
被分割成蓝色,绿色和红色的3个平面,它们共同存储在向量BGR
中。所以BGR[0]
是uchar
数据类型像素的第一个(蓝色)平面…因此它将是
int dataB = (int)BGR[0].at<uchar>(i,j);
int dataG = (int)BGR[1].at<uchar>(i,j);
等等…
必须为cv::Mat::at(i,j)
指定正确的类型。您访问像素为int
,而它应该是uchar
的矢量。你的代码应该看起来像这样:
IplImage* img = 0;
img = cvLoadImage("nature.jpg");
if(img != 0)
{
Mat Img_mat(img);
std::vector<Mat> BGR;
split(Img_mat, BGR);
Vec3b data = BGR[0].at<Vec3b>(i,j);
// data[0] -> blue
// data[1] -> green
// data[2] -> red
}
为什么要先加载IplImage ?您正在混合使用C和c++接口。直接用imread加载cv::Mat会更直接。
这样,您还可以指定类型,并在调用中使用相应的类型。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- Difference in displaying cv2 Mat
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 用于矢量处理的多个线程
- 使外部项目可用于find_package CMake
- 用于安卓人脸识别的 openCV 显示"mat not continuous"错误
- 如何在OpenCV上创建用于制作直方图的Mat
- 在opencv中使用Mat::at(i,j)用于二维Mat对象