精华内容
下载资源
问答
  • opencv获取像素值

    2020-07-21 13:38:33
    1. 通过指针访问像素值 IplImage *Temp=*iterIplOri; uchar *dataaa=(uchar*)Temp->imageData; int step=Temp->widthStep/sizeof(uchar); int channals=Temp->nChannels; int r=0,g=0,b=0; for ...

    1. 通过指针访问像素值

            IplImage *Temp=*iterIplOri;
     
            uchar *dataaa=(uchar*)Temp->imageData;
            int step=Temp->widthStep/sizeof(uchar);
            int channals=Temp->nChannels;
            int r=0,g=0,b=0;
     
     
            for (int jj=Temp->height-1;jj>0;jj--)
            {
                for (int kk=0;kk<Temp->width;kk++)
                {
                    r=dataaa[jj*step+kk*channals+0];
                    // g and b are zeros for gray image 
                    g=dataaa[jj*step+kk*channals+1]; 
                    b=dataaa[jj*step+kk*channals+2];
     
                    if (r>nTemp)
                    {
                        nTemp=r;
                    }
                }
            }
        
     


    2. 通过该像素的坐标获得像素值
            
            IplImage *Temp=*iterIplOri;        
            // nTesty is y cordinate,nTestx is x cordinate
            CvScalar pColor=cvGet2D(Temp,nTesty,nTestx);   
            int Pixl1=pColor.val[0];
            int Pixl2=pColor.val[1];
            int Pixl3=pColor.val[2];
     

    展开全文
  • #include <iostream>...opencv2/opencv.hpp> #include<opencv2/highgui/highgui.hpp> using namespace std; using namespace cv; int main() { Mat srcImg; srcImg = imread("Leno.jp...
    #include <iostream>
    #include <opencv2/opencv.hpp>
    #include<opencv2/highgui/highgui.hpp>
    using namespace std;
    using namespace cv;
    
    int main()
    {
    	Mat srcImg;
    	srcImg = imread("Leno.jpg");
    	if (srcImg.empty())
    	{
    		cout << "Image load failed" << endl;
    		return -1;
    	}
    	for (int i = 0; i < srcImg.rows; i++)
    	{
    		for (int j = 0; j < srcImg.cols; j++)
    		{
    			if (srcImg.channels == 1)  //单通道图像,比如灰度图像
    			{
    				int g = srcImg.at<uchar>(i, j);
    			}
    			else
    			{
    				int b = srcImg.at<Vec3b>(i, j)[0];
    				int g = srcImg.at<Vec3b>(i, j)[0];
    				int r = srcImg.at<Vec3b>(i, j)[0];
    			}
    		}
    	}
    	return 0;
    }

     

    展开全文
  • OpenCV 获取像素值的几个方法

    千次阅读 2014-03-06 14:06:33
    Fn 1 : 使用 Mat 中对矩阵元素的地址定位的知识 (参考博文:OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解) Code 1 : int main

    http://tmjfzy.blog.163.com/blog/static/6644702520126157403724/

    Fn 1 :

    使用 Mat 中对矩阵元素的地址定位的知识 (参考博文:OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解

    Code 1 :

    int main()
    {
        //新建一个uchar类型的单通道矩阵(grayscale image 灰度图)
        Mat m(400, 400, CV_8U, Scalar(0));
        for (int col = 0; col < 400; col++)
        {
            for (int row = 195; row < 205; row++)
            {
                cout << (int)(*(m.data + m.step[0] * row + m.step[1] * col)) << "  ==> ";
                //获取第[row,col]个像素点的地址并用 * 符号解析
                *(m.data + m.step[0] * row + m.step[1] * col) = 255;
                cout << (int)(*(m.data + m.step[0] * row + m.step[1] * col)) << endl;
            }
        }
        imshow("canvas", m);
        cvWaitKey();
        return 0;
    }

    Output 1 :

    0  ==> 255
    0  ==> 255
    0  ==> 255
    0  ==> 255
    0  ==> 255
    0  ==> 255
    ...

    image

    Code1只是演示了单通道的情况,对于多通道的例子,请看 Code2 然后再看 Code3。


    Fn 2 :

    使用 Mat::at 函数

    • 原型 template<typename _Tp> inline _Tp& Mat::at(…) //其中参数有多个,也就是说 at 函数有多个重载
    • 返回值为 Mat 类型, Mat 有个索引的重载,也就是 [] 符号的重载,用这个重载可以定位多通道数据,具体示例可以看下面代码

    下面的代码把红色通道值大于128的颜色的置为白色,左边为原图,右边为处理过后的图。

    Code 2 :

    int main()
    {    
        Mat img = imread("lena.jpg");
        imshow("Lena Original", img);
    
    
        for (int row = 0; row < img.rows; row++)
        {
            for (int col = 0; col < img.cols; col++)
            {    
                /* 注意 Mat::at 函数是个模板函数, 需要指明参数类型, 因为这张图是具有红蓝绿三通道的图,
                   所以它的参数类型可以传递一个 Vec3b, 这是一个存放 3 个 uchar 数据的 Vec(向量). 这里
                   提供了索引重载, [2]表示的是返回第三个通道, 在这里是 Red 通道, 第一个通道(Blue)用[0]返回 */
                if(img.at<Vec3b>(row, col)[2] > 128)
                    img.at<Vec3b>(row, col) = Vec3b(255, 255, 255);
            }
        }
    
    
        imshow("Lena Modified", img);
        cvWaitKey();
        return 0;
    }

    Output 2 :

    image

    Code 3 :

    这段代码用的是 Fn1 的方式,效果和 Code 2 等价:

    int main()
    {    
        Mat img = imread("lena.jpg");
        imshow("Lena Original", img);
    
    
        for (int row = 0; row < img.rows; row++)
        {
            for (int col = 0; col < img.cols; col++)
            {
                //主要是这里的代码
                if(*(img.data + img.step[0] * row + img.step[1] * col + img.elemSize1() * 2) > 128)
                {
                    //[row, col]像素的第 1 通道地址被 * 解析(blue通道)
                    *(img.data + img.step[0] * row + img.step[1] * col) = 255;
                    //[row, col]像素的第 2 通道地址被 * 解析(green通道), 关于elemSize1函数的更多描述请见 Fn1 里所列的博文链接
                    *(img.data + img.step[0] * row + img.step[1] * col + img.elemSize1()) = 255;
                    //[row, col]像素的第 3 通道地址被 * 解析(red通道)
                    *(img.data + img.step[0] * row + img.step[1] * col + img.elemSize1() * 2) = 255;
                }
            }
        }
    
    
        imshow("Lena Modified", img);
        cvWaitKey();
        return 0;
    }

    Output 3 = Output 2


    Fn 3 :

    使用 Mat 的一个模板子类 Mat_<typename _Tp> 的 ( ) 符号重载定位一个像素

    Code 4 :

    int main()
    {    
        Mat m(400, 400, CV_8UC3, Scalar(255, 255, 255));
        // m2 是 Mat_<Vec3b> 类型的, 因为 m 中元素的类型是 CV_8UC3, 可以用 Vec3b 存储 3 个通道的值
        // 注意 Mat_<CV_8UC3> 这种写法是错误的, 因为 CV_8UC3 只是一个宏定义
        // #define CV_8UC3 CV_MAKETYPE(CV_8U, 3)
        Mat_<Vec3b> m2 = m;
        
        // for 循环画一个红色的实心圆
        for (int y = 0; y < m.rows; y++)
        {
            for (int x = 0; x < m.rows; x++)
            {
                if (pow(double(x-200), 2) + pow(double(y-200), 2) - 10000.0 < 0.00000000001)
                {
                    // Mat_ 模板类实现了对()的重载, 可以定位到一个像素
                    m2(x, y) = Vec3b(0, 0, 255);
                }
            }
        }
     
        imshow("Image", m);
        cvWaitKey();
        return 0;
    }

    Output 4 : [ 看上去怎么有点不爽失望]

    image


    Fn 4 :

    使用 Mat::ptr 模板函数

    Code 5 :

    int main()
    {    
        Mat m(400, 400, CV_8UC3, Scalar(226, 46, 166));
        imshow("Before", m);
     
        for (int row = 0; row < m.rows; row++)
        {
            if (row % 5 == 0)
            {
                // data 是 uchar* 类型的, m.ptr<uchar>(row) 返回第 row 行数据的首地址
                // 需要注意的是该行数据是按顺序存放的,也就是对于一个 3 通道的 Mat, 一个像素有
                // 有 3 个通道值, [B,G,R][B,G,R][B,G,R]... 所以一行长度为:
                // sizeof(uchar) * m.cols * m.channels() 个字节
                uchar* data = m.ptr<uchar>(row);
                for (int col = 0; col < m.cols; col++)
                {
                    data[col * 3] = 102; //第row行的第col个像素点的第一个通道值 Blue
                    data[col * 3 + 1] = 217; // Green
                    data[col * 3 + 2] = 239; // Red
                }
            }
        }
        imshow("After", m);
     
        cout << (int)m.at<Vec3b>(0, 0)[0] << ','; //利用 Fn 1 介绍的方法输出一下像素值到控制台
        cout << (int)m.at<Vec3b>(0, 0)[1] << ',';
        cout << (int)m.at<Vec3b>(0, 0)[2] << endl;
     
        cvWaitKey();
        return 0;
    }

    Output 5 :

    image



    展开全文
  • opencv获取图像像素值

    2014-04-16 22:34:01
    opencv获取图像像素值,学习opencv如何读图片并显示出来,获取像素值
  • opencv获取像素

    2019-09-28 20:23:13
    opencv获取图像像素的方法 方法一: IplImage *img = cvLoadImage("Lena.jpg", 0); CvScalar pixel;for (int i = 0; i < img->height; ++i){ for (int j = 0; j < img->width; ++j) {...

     

    opencv中获取图像像素的方法

    方法一:

       IplImage *img = cvLoadImage("Lena.jpg", 0);

       CvScalar pixel;
     for (int i = 0; i < img->height; ++i)
     {
         for (int j = 0; j < img->width; ++j)
          {
             //获得像素的RGB值并显示    

              pixel = cvGet2D(img, i, j);
               printf("B=%f,G=%f,R=%f\t", pixel.val[0], pixel.val[1], pixel.val[2]);
             //修改各点的值
              pixel.val[0] = 0;   // B分量
              pixel.val[1] = 0;   // G分量
              pixel.val[2] = 0;   // R分量
             cvSet2D(img, i, j, pixel);
      }
     }

    注意内存中存储顺序是BGR

    方法二:

     for (int i = 0; i < img->height; ++i)
     {
            for (int j = 0; j < img->width; ++j)
         {

            int  b = CV_IMAGE_ELEM(paintx, uchar, y1, x1 * 3);

            int  g = CV_IMAGE_ELEM(paintx, uchar, y1, x1 * 3+1);

            int  r= CV_IMAGE_ELEM(paintx, uchar, y1, x1 * 3+2);
          }

    }

    方法三:

    对于单通道字节型图像:

     IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); 

     ((uchar *)(img->imageData + i*img->widthStep))[j]=111;

    对于多通道字节型图像:

    IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); 

     ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B

     ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G

     ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R

    对于多通道浮点型图像:

     IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); 

     ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B

     ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G

     ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R

     

    3 ((uchar*)(Img1->imageData + Img1->widthStep*pt.y))[pt.x]的具体含义:
     (1)这里img1->imagedata指的图像第一行的首地址,pt.y是指图像的height(图像高像素数即行数),y乘以img->widthstep(排列的图像行大小)即首地址加上行数乘以每行总数,得到第y行的首地址。widthstep是指图像每行所占的字节数,主要要和width区别,width是指每行所含的像素个数,但是一个像素也可能占一个字节,也可能占三个字节或者四个。imagedata是指向存储图像像素值数组的指针,内容是这个数组的首地址,pt.y指的是像素点的行坐标,所以Img->imageData + Img->widthStep*pt.y便是该像素点所在行的首地址,然后再加上该像素点所在的列,即pt.x,就得到了该像素点的地址,所以那句代码也可以写成

    ((uchar*)(Img1->imageData + Img1->widthStep*pt.y+pt.x)),

    都是指该像素点的像素值,至于强制类型转换,是因为会产生一些负值,而像素值是不能为负的。

    (2)widthStep表示存储一行像素需要的字节数。
    widthStep必须是4的倍数,如果8U图像宽度为3,那么widthStep是4,加一个字节补齐。这个图像的一行需要4个字节,只使用前3个,最后一个空在那儿不用。也就是一个宽3高3的图像的imageData数据大小为4*3=12字节。如果32F的图像,那么widthStep=width*4。

    转载于:https://www.cnblogs.com/Peit/p/6431066.html

    展开全文
  • OpenCV处理像素值

    2013-11-14 16:43:37
    OpenCV对像素值的获取及赋值1 OpenCV中像素值的获取 Opencv 获取像素值主要有两种方式:1.1 CvScalar OpenCV中,CvScalar结构为: typedef struct CvScalar { double val[4]; } CvScalar; CvScalar s...
  • opencv 获取Mat像素值

    千次阅读 2016-03-11 09:21:51
    opencv 访问Mat中每个像素 转自:http://blog.csdn.net/xiaowei_cqu/article/details/19839019 方法零:.ptr和[]操作符 Mat最直接的访问方法是通过.ptr [cpp] view plain copy   ...
  • #获取像素值并修改 #way1: img = cv2.imread('test.jpg') #读入图像0(灰色),1或无(彩色) px = img[100,100] #获取像素值 img[100, 100] = [255, 255, 255] #修改像素值 print(px) #img[0, 0]是个类似坐标的东西...
  • 我有一张二化图像,想获得某个像素点的,但发现结果明显是错误的,我的代码为: Mat BW = imread(imgName); int value = BW.at<uchar>(191, 51); 出来的是248,但用matlab这个点是0 请问是哪里出了...
  • opencv利用鼠标获取像素值

    千次阅读 2013-12-20 16:07:35
    参考:opencv利用鼠标获取像素值 原文只获取了彩色图像rgb值,我小小的改动了一下,使能够自适应获取像素值 #include #include #include #include #include using namespace std; void ...
  • OpenCV获取与设置像素点的的几个方法
  • 主要为大家详细介绍了OpenCV获取鼠标左键点击位置图像的像素值,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • opencv获取图像像素值的两种方法

    千次阅读 2016-08-02 11:10:07
    pucPixel[j]即为该点像素值,可进行操作 ...  ... } } 最近在学习过程中又看到一种方法:  for ( int i = 0 ; i < img->height; ++ i) { for ( int j = 0 ; j < img->width; ++ j)...
  • 使用VS2013+opencv获取鼠标左键点击位置图像的像素值
  • 采用OpenCV获取图像某点的像素值

    热门讨论 2011-01-30 18:59:15
    这是基于vc++的例程,实现了采用OpenCV获取某一点的像素值。OpenCV是intel公司开发的编程工具包,就有强大的图像处理功能。
  • opencv获取图像的像素值

    千次阅读 2015-08-12 23:08:24
    1、matlab获取彩色图像像素值的方法  img=imread('test.jpg');  img1=img(:,:,1);  img2=img(:,:,2);  img3=img(:,:,3);  三通道排序分别对应彩色图像的rgb三通道 2、opencv获取图像像素的方法 ...
  • Title: OpenCV OpenCV像素值获取与设置
  • Opencv获取并改变图像的像素值

    万次阅读 2010-11-03 19:07:00
    Opencv获取并改变图像的像素值
  • OpenCV对图像获取像素值方法总结

    千次阅读 2012-12-11 13:40:46
    常规方法获取像素值: cv::Mat cvImg = imread("E:\\Test,jpg"); for(int i = 0;i ; i++){ for(int j = 0;j ;j++){ s = cvGet2D(img,i,j); // get the (i,j) pixel value s
  • #include #include #include "opencv.hpp" using namespace cv; void setSaltNoise(cv::Mat& img,int count) { srand((unsigned)time(NULL)); for (int i = 0; i ; i++) {
  • 使用OpenCV获取图像中某一点的像素值和修改某一点的像素值   int my_getpixel() {  IplImage *img=cvLoadImage("D:\\Case\\Train1.bmp",1);  CvScalar s;  for(int i=0;...
  • 作者:wangtaohappy 转自:... 1.cvGet2D(图片, y坐标, x坐标) 速度慢 CvScalar s; s = cvGet2D(src, j,i);//获取src图像中坐标为(i,j)的像素点的 s.val[0] 代表src图像BGR中的B
  • #include <opencv2/opencv.hpp> using namespace std; using namespace cv; void setSaltNoise(Mat& image , int count) { //以当前时间为产生随机数的种子 srand((unsigned)time(NULL)); for(int i=0;i;i++) ...
  • 图像像素值获取与显示
  • 功能:利用opencv获取鼠标左键点击位置图像的像素值(RGB像) vs2015+opencv3.1 2016.10.22#include<opencv2\opencv.hpp> #include using namespace std; using namespace cv; void on_mouse(int EVENT, int x, ...
  • 使用OpenCV获取和设置像素2.OpenCV像素获取和设置结果3.源代码下载 什么是像素 图像坐标系在OpenCV中的工作方式 如何访问/获取图像中的单个像素值 如何设置/更新图像中的像素 如何使用数组切片来捕获图像区域 在本...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 581
精华内容 232
关键字:

opencv获取像素值