【问题标题】:How access to a pixel value in a binary Mat image?如何访问二进制 Mat 图像中的像素值?
【发布时间】:2013-10-24 09:49:14
【问题描述】:

我正在使用 Visual C++ 和 OpenCV。

我想问,OpenCV中如何访问Mat中的像素元素。

我的意思是,我想在二进制 Mat 图像中验证一个像素是 1 还是 0...图像是二进制阈值...

如何使用 x 和 y(或行和列)访问像素并验证此值?

你能帮帮我吗?提前致谢。

【问题讨论】:

    标签: c++ visual-c++ opencv image-processing


    【解决方案1】:

    对于 Mat 元素访问,您可以参考 OpenCV 官方 Doc,这些 link1, link2 可能会有所帮助

    这里有一个简单的代码,可以根据你的鼠标位置访问像素值并显示像素值。

    #include <iostream>
    #include <stdio.h>
    #include <opencv2/opencv.hpp>
    
    using namespace cv;
    using namespace std;
     Mat image, src;
     char window_name[20]="Pixel Value Demo";
    
    void onMouse( int event, int x, int y, int f, void* ){
     image=src.clone();
     Vec3b pix=image.at<Vec3b>(y,x);
     int B=pix.val[0];
     int G=pix.val[1];
     int R=pix.val[2];
    
    
     char name[30];
        sprintf(name,"R=%d",R);
        putText(image,name, Point(10,130) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );
    
        sprintf(name,"G=%d",G);
        putText(image,name, Point(10,170) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );
    
        sprintf(name,"B=%d",B);
        putText(image,name, Point(10,210) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );
    
        sprintf(name,"X=%d",x);
        putText(image,name, Point(10,300) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );
    
        sprintf(name,"Y=%d",y);
        putText(image,name, Point(10,340) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );
     imshow( window_name, image );
    }
    
    
    
    int main( int argc, char** argv )
    {
      namedWindow( window_name, CV_WINDOW_AUTOSIZE );
    
      src = imread( "ball.jpg");
      imshow( window_name, src );
    
      setMouseCallback( window_name, onMouse, 0 );
    
      waitKey(0);
    
      return 0;
    }
    

    编辑:-

    对于二值图像,您可以使用 Mat::at(row,col) 方法访问像素值。

    在下面的示例中显示如何执行此操作。这里的图像是 uchar 类型的。

     Mat src(480,640,CV_8UC1,Scalar(0));
     circle(src,Point(src.cols/2,src.rows/2),100,Scalar(255),-1,8,0);
    
     int pix=(int)src.at<uchar>(src.rows/2,src.cols/2);
     cout<<pix<<endl; 
    

    【讨论】:

    • 很抱歉,此解决方案适用于灰色或彩色图像。我有一个二进制阈值图像,并且在运行时 opencv 使用函数“image.at 为二进制图像创建寻址错误。你能告诉我如何访问二进制图像上的像素值吗?我在互联网上搜索过opencv 指南,但例如它总是用于灰色或彩色图像...
    • binary.at&lt;uchar&gt;(cv::Point2i(u,v)) = 255; 用于设置二进制文件的元素。我对二进制文件的其他方法也没有运气。 (u, v) 是我的 int 像素坐标,mat 被初始化为 cv::Mat binary(cv::Mat::zeros(mask_size, CV_8UC1));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2015-09-01
    • 2013-05-21
    • 2016-01-07
    • 1970-01-01
    • 2012-11-01
    相关资源
    最近更新 更多