Mat.at <uchar>和Mat.at <int>之间的区别是什么

时间:2016-10-23 20:09:53

标签: types opencv3.0 mat

我在网上找到了使用以下代码的代码

cv::VideoCapture frame_capture;
...
cv::Mat frame;
frame_capture.read(frame);
...
std::vector<cv::Mat> bgr_planes;
split(frame, bgr_planes);
...
int curr_pixel = (bgr_planes[0].at<uchar>(row_index,col_index));
...

从Mat向量中获取值并将其赋值给变量

当我尝试按.at<uchar>更改.at<int>时,我发现此错误

OpenCV Error: Assertion failed (dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] && (unsigned)(i1*DataType<_Tp>::channels) < (unsigned)(size.p[1]*channels()) && ((((sizeof(size_t)<<28)|0x8442211) >> ((DataType<_Tp>::depth) & ((1 << 3) - 1))*4) & 15) == elemSize1()) in cv::Mat::at, file C:\Open_CV\opencv\build\include\opencv2/core/mat.hpp, line 537

我的问题是.at返回一个整数,为什么我们有.at<uchar>

1 个答案:

答案 0 :(得分:2)

  

因为.at返回一个整数,为什么我们有.at?

你的前提是错的:

 .at<type>

返回给定类型的变量。然后你可以转换为另一种类型,比如“int”。

这相当于:

uchar original_value = mat.at<uchar>(row, col);
int int_value = original_value;

错误意味着你超出了矩阵数据的范围,因为你正在索引一个uchar数组(1个字节),好像它是一个int数组(4个字节)