【问题标题】:Accessing pixel value with .at<uchar> and .at<Vec3b> does not work使用 .at<uchar> 和 .at<Vec3b> 访问像素值不起作用
【发布时间】:2014-03-07 11:48:18
【问题描述】:

我正在尝试使用 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');

在分类()中:

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;
}

【问题讨论】:

  • 请提供更多代码。这似乎是 imgGrayComp 的问题,也许是一些大小/类型/深度不匹配?需要更多信息。
  • 添加了更多代码。希望这会有所帮助。

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


【解决方案1】:

问题在于:

您没有使用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);

或者,您甚至可以在使用 cvtColor 之前使用imshow 来查看图像是否显示成功。干杯。

【讨论】:

  • 就是这样! ... 固定的。你是对的。原来文件的路径是错误的。我必须从 Debug 文件夹备份到其父文件夹,然后备份到“src”同级文件夹。现在看来我一直在处理两个问题,我不知道该标记哪个最好。
  • @Andrey,我确实以最快的速度回答了你的两个问题,所以我请你给我接受的答案。哈哈。但是当然,为了避免下次出现这样的困境,在当前问题解决后出现新问题后,大多数人通常采取的步骤是接受答案,然后针对新问题发布另一个答案。您可以将新问题的链接评论到已回答的帖子中,以提醒回答的人,以便他在解决新问题时可以获得更多代表(:
  • 我不确定我是否全部理解。解决第一个问题后,我将其标记为最佳答案(即使我知道同一代码中有另一个问题),在该答案中添加注释,并附上第二个问题答案的链接……这就是你的位置我失去了我。一步一步地引导我。
  • 哈哈。这不是必须的。这只是某些用户所做的,意思是第二个问题,你复制链接,例如,这个问题的链接:stackoverflow.com/questions/22234801/…,并通过回答你第一个问题的人的帖子的评论分享该链接并说按照你的方法等之后出现了一个新的问题,看看你知道怎么解决吗?
  • 但是不同的用户,不同的心态。它只是一个建议,因为我看到人们这样做。 (;
【解决方案2】:

使用错误的 convertTo 调用,您将图像转换为 64F 精度。

你在这里做什么

image.convertTo(imageGrayClassify, COLOR_BGR2GRAY);

等价于

image.convertTo(imageGrayClassify, CV_64F);

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

我想你的意思是在那里使用cvtColor

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

【讨论】:

  • 我确实尝试过 cvtColor(image, imageGrayClassify, CV_BGR2GRAY ); ,但命令提示符吐出了 OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::cvtColor, file ..\..\..\..\opencv\modules\imgproc\src\color.cpp, line 3737 。此外,根据您链接到的页面, cvtColor() 的第一个参数必须是 constArr * ,而不是 Mat
  • ^ 对不起,我写了constArr * ...我的意思是const cvArr *
  • 您使用的是 c++ 接口,并且 cvtColor 接受 Mat 数据类型。您也可以使用 c 接口并使用 IplImage* 作为您的图像数据类型,它是从 cvArr*
【解决方案3】:

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

你需要

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

那么您应该能够使用.at&lt;uchar&gt;(5, 4) 访问imgGrayComp。请注意.at&lt;Vec3b&gt;(5, 4) 仍然是错误的,因为灰度图像只有一个通道。 Vec3b 通常用于 3 通道 8 位图像。

【讨论】:

  • 1) 感谢您的意见。 2) 在此处查看我对 Canberk 答案的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 2017-04-23
  • 2015-03-24
  • 1970-01-01
  • 2021-01-28
  • 2020-01-21
相关资源
最近更新 更多