使用.at <uchar>和.at <vec3b>访问像素值不起作用</vec3b> </uchar>

时间:2014-03-06 20:06:39

标签: opencv visual-studio-2012 pixel pixels grayscale

我正在尝试使用Visual Studio Express 2012 for Windows Desktop重写Mat类型灰度图像中的像素值。我试过了:

imgGrayComp.at<uchar>(5, 4) = 0; 

imgGrayComp.ptr(4)[5] = 0; 

imgGrayComp.at<Vec3b>(5, 4) = 0;

但它给了我这个:

OpenCV Error: Assertion failed (dims <= 2 && data && (unsigned)i0 < (unsigned)size.p[0] && (unsigned)(i1DataType<_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:\opencv\build\include\opencv2\core\mat.hpp, line 537

=============================================== ===========================================

编辑 - 这是代码:

调用classify():

classify("./src/0.jpg", contour, hierarchy, mDatabase, '0');

在classify()中:

void classify(std::string imageFile, 
    vector<vector<Point> > contour,
    vector<Vec4i> hierarchy, float mDatabase [][charsToClassify],
    char whichChar)
{
    Mat image = imread(imageFile, 1);
    Mat imageGrayClassify;

    image.convertTo(imageGrayClassify, COLOR_BGR2GRAY);
    int numPoints = computeNumContourPts(imageGrayClassify); // calling compute...()
}

在计算中......():

int computeNumContourPts(Mat imgGrayComp)
{

    // dilation x1 (increases workload):
    dilate(imgGrayComp, imgGrayComp, Mat(), Point(-1,-1), 2);
    // erosion x1 (decreases workload):
    erode(imgGrayComp, imgGrayComp, Mat(), Point(-1,-1), 1);

    imgGrayComp.at<uchar>(5, 4) = 0;
}

3 个答案:

答案 0 :(得分:2)

问题在于:

您使用cv::cvtColor(image, imageGrayClassify, CV_BGR2GRAY);而不是使用image.convertTo(),而是用于转换图像的数据类型。

关于对Canberk的答案的新错误的评论,这很简单,你的image可能是空/空。

使用

CV_Assert(!image.empty()); //use this then the cvtColor, note this is a comment!!!

cvtColor(image,imageGrayClassify, CV_BGR2GRAY);

或者,您可以使用imshow查看图像是否在使用cvtColor之前成功显示。欢呼声。

答案 1 :(得分:1)

问题是imageGrayClassify不是image的灰度图像。您使用可以转换e的.convertTo()。 G。一个CV_32F - 图像到CV_8U - 图像但不是BGR到灰色。此调用会将图片转换为CV_64F,因为CV_BGR2GRAY == CV_64F == 6。所有只是宏和一个typeunsafe接口。

你需要

cv::cvtColor(image, imageGrayClassify, CV_BGR2GRAY);

然后你应该能够imgGrayComp访问.at<uchar>(5, 4)。请注意.at<Vec3b>(5, 4)仍然是错误的,因为灰度图像只有一个通道。 Vec3b通常用于3通道8位图像。

答案 2 :(得分:1)

如果对convertTo的调用错误,则表示您将图像转换为64F精度。

你在这做什么

image.convertTo(imageGrayClassify, COLOR_BGR2GRAY);

相当于

image.convertTo(imageGrayClassify, CV_64F);

因为convertTo需要一个数据类型枚举;不是转换枚举。您的转换枚举(COLOR_BGR2GRAY = 6)将转换为数据类型枚举(CV_64F = 6)。

我想你打算在那里使用cvtColor

由于您的imageGrayComp不是灰度也不是8U,因此您无法使用vec3b或uchar访问其像素。