如何在 OpenCV 中使用网络摄像头捕获 Mat 图像的像素值

Posted

技术标签:

【中文标题】如何在 OpenCV 中使用网络摄像头捕获 Mat 图像的像素值【英文标题】:How to get pixel value of Mat image with webcam capture in OpenCV 【发布时间】: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)。如果我犯了一些错误,请纠正我。 【参考方案1】:

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

if(distanceTr.at<float>(0,0) == 0)

   cout<<1;

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

【讨论】:

其他人在访问distanceTransform() 时遇到问题? @berak... 不。什么问题? 页面加载不正确。如果它适合你,nvm。

以上是关于如何在 OpenCV 中使用网络摄像头捕获 Mat 图像的像素值的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 和 Python-2.7 进行屏幕截图

如何将 Mat 数据(OpenCV,图像数据格式)转换为统一的 3d 纹理

洞察使用 python 和 OpenCV 与 VideoCapture 进行多网络摄像头捕获

OpenCv - 从网络摄像头捕获帧时发生内存泄漏

通过网络摄像头使用 OpenCV 捕获图像

OpenCV 视频捕获 API