【问题标题】:Accessing pixel value using cv::Mat::at operator使用 cv::Mat::at 运算符访问像素值
【发布时间】:2012-09-17 14:51:32
【问题描述】:

我正在使用 OpenCV 2.3.1 (c++ api),当我尝试获取彩色图像的像素值时,我得到了非常奇怪的结果,而不是值数字,输出是这样的:?,* , |等等,例如代码如下:

cv::Mat inputImage = cv::imread("Picture1.jpg");
std::cout << inputImage.at<cv::Vec3b>(x,y)[0] << std::endl; //print B component

其中 x 和 y 是来自鼠标回调函数的坐标。我认为该类型是错误的,您知道我还可以使用什么来代替 Vec3b?

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

    我认为问题的发生是因为您使用的是“at(x, y)”。文档说第一个参数应该是“基于 0 的行索引”和第二个“基于 0 的列索引”。因此,您应该调用 at(y, x) 或 at(cv::Point(x, y))。

    【讨论】:

    • 虽然这是对的,但发布的代码中可能存在错误(访问 .at(x,y) 而不是 .at(y,x)),打印奇怪字符而不是数字看起来仍然更像是一个类型转换问题。
    【解决方案2】:

    查看http://opencv.willowgarage.com/documentation/cpp/basic_structures.html

    OpenCV 中的 Vec3b 是 typedef Vec&lt;uchar, 3&gt; Vec3b;。所以,我猜你需要在 cout 过程中转换为整数。

    类似std::cout &lt;&lt; (int) inputImage.at&lt;cv::Vec3b&gt;(x,y)[0] &lt;&lt; std::endl; //print B component

    【讨论】:

    • 是的,你是对的,但我无法打印我想要的所有内容,当我使用两个循环访问每个像素时程序崩溃,它可能打印出 100 个值然后停止:for(int i=0; i&lt;inputImage.rows; i++) for(int j=0; i&lt;inputImage.cols; j++) std::cout &lt;&lt; (int)inputImage.at&lt;cv::Vec3b&gt;(j,i)[0] &lt;&lt; std::endl;跨度>
    • OpenCV 错误:断言失败 mat.hpp 中第 552 行的内容
    • 不,我刚刚创建了控制台应用程序,并插入了我在这里写的那些行,只是为了看看它是否有效。
    • 好的,控制台应用程序必须使用一些断言函数。无论如何,检查你的内部循环for(int j=0; i&lt;inputImage.cols; j++) 你正在与 i 进行比较,并增加 j。
    猜你喜欢
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2011-11-03
    • 2014-11-04
    相关资源
    最近更新 更多