【问题标题】:How to get pixel value of Mat image with webcam capture in OpenCV如何在 OpenCV 中使用网络摄像头捕获 Mat 图像的像素值
【发布时间】:2014-04-24 05:28:08
【问题描述】:

嗯,我是 openCV 和图像处理方面的新手,我肯定需要帮助。我需要获取 Mat 的每个像素值。此图像由网络摄像头(实时)捕获。 我已经从一些人的问题中尝试了一些解决方案,但它不适用于我的项目。 这是我的一些代码:

    Mat blackWhite;
    Mat binary;
    Mat distanceTr;
    cvtColor(frame, blackWhite, CV_BGR2GRAY);
    GaussianBlur(blackWhite, blackWhite, Size(15,15), 6.5, 6.5);
    threshold(blackWhite, binary, 80, 255, CV_THRESH_BINARY);
    Mat invBinary =  Scalar(255) - binary;
    distanceTransform(invBinary, distanceTr, CV_DIST_L2,3);

对于像素值的访问,我做了这个:

for(int i = 0; i < distanceTr.rows; i++)
{
    for(int j = 0; j < distanceTr.cols; j++)
    {
        if(distanceTr.at<uchar>(0,0) == 0)
        {
            cout << 1;
        }
    }
}

对于网络摄像头节目,我使用

    imshow("Project", distanceTr);

据我所知,distanceTr是灰度图,所以是1通道图。根据一些答案,我尝试了 .at 但它不起作用:( 我正在做一个测试用例,如果 (0,0) 像素为黑色,它将打印 1。我得到的是未处理的异常错误。 请问有什么可以帮忙的吗?

非常感谢。 (抱歉英语不好)

【问题讨论】:

  • distanceTrandform 的输出图像是CV_32FC1 类型的,所以你可能应该这样做:if(distanceTr.at&lt;float&gt;(0,0) == 0) cout&lt;&lt;1
  • @sgar91 是的,非常感谢。它现在正在工作。 :) 我在哪里可以获得关于什么类型的图像给出什么样的输出的信息?像这种情况 distanceTransform 使 CV_32FC1.
  • 你为什么在那个循环中一遍又一遍地检查同一个位置(0,0)?没有任何意义。
  • @berak 可能是(i,j)
  • @berak 还处于进程的开始阶段,所以我只想检查 (0,0) 像素是否为黑色。如果是黑色,那么我只打印 1,否则不打印。只是简单的检查。稍后我将其更改为 (i,j)。如果我犯了一些错误,请纠正我。

标签: c++ opencv


【解决方案1】:

distanceTransform 的输出图像是CV_32FC1 类型,所以每个像素都是float 类型。要访问像素值,您必须执行以下操作:

if(distanceTr.at<float>(0,0) == 0)
{
   cout<<1;
}

opencv documentation中给出了每个函数参数的描述,比如图片的大小和类型等。

【讨论】:

  • 其他人在访问distanceTransform() 时遇到问题?
  • @berak... 不。什么问题?
  • 页面加载不正确。如果它适合你,nvm。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-18
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 2013-02-09
相关资源
最近更新 更多