精华内容
下载资源
问答
  • #include <iostream> #include <opencv2/opencv.hpp> #include<opencv2/highgui/highgui.hpp> using namespace std;...using namespace cv;... 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 获取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   ...

    opencv 访问Mat中每个像素的值

    转自:http://blog.csdn.net/xiaowei_cqu/article/details/19839019

    方法零:.ptr和[]操作符

    Mat最直接的访问方法是通过.ptr<>函数得到一行的指针,并用[]操作符访问某一列的像素值。

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // using .ptr and []  
    2. void colorReduce0(cv::Mat &image, int div=64) {  
    3.       int nr= image.rows; // number of rows  
    4.       int nc= image.cols * image.channels(); // total number of elements per line  
    5.       for (int j=0; j<nr; j++) {  
    6.           uchar* data= image.ptr<uchar>(j);  
    7.           for (int i=0; i<nc; i++) {  
    8.                   data[i]= data[i]/div*div + div/2;  
    9.             }                    
    10.       }  
    11. }  


    方法一:.ptr和指针操作

    除了[]操作符,我们可以移动指针*++的组合方法访问某一行中所有像素的值。

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // using .ptr and * ++   
    2. void colorReduce1(cv::Mat &image, int div=64) {  
    3.       int nr= image.rows; // number of rows  
    4.       int nc= image.cols * image.channels(); // total number of elements per line  
    5.       for (int j=0; j<nr; j++) {  
    6.           uchar* data= image.ptr<uchar>(j);  
    7.           for (int i=0; i<nc; i++) {  
    8.                  *data++= *data/div*div + div/2;  
    9.             } // end of row                   
    10.       }  
    11. }  


    方法二:.ptr、指针操作和取模运算

    方法二和方法一的访问方式相同,不同的是color reduce用模运算代替整数除法

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // using .ptr and * ++ and modulo  
    2. void colorReduce2(cv::Mat &image, int div=64) {  
    3.       int nr= image.rows; // number of rows  
    4.       int nc= image.cols * image.channels(); // total number of elements per line  
    5.       for (int j=0; j<nr; j++) {  
    6.           uchar* data= image.ptr<uchar>(j);  
    7.           for (int i=0; i<nc; i++) {  
    8.                   int v= *data;  
    9.                   *data++= v - v%div + div/2;  
    10.             } // end of row                   
    11.       }  
    12. }  


    方法三:.ptr、指针运算和位运算

    由于进行量化的单元div通常是2的整次方,因此所有的乘法和除法都可以用位运算表示。

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // using .ptr and * ++ and bitwise  
    2. void colorReduce3(cv::Mat &image, int div=64) {  
    3.       int nr= image.rows; // number of rows  
    4.       int nc= image.cols * image.channels(); // total number of elements per line  
    5.       int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));  
    6.       // mask used to round the pixel value  
    7.       uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0  
    8.       for (int j=0; j<nr; j++) {  
    9.           uchar* data= image.ptr<uchar>(j);  
    10.           for (int i=0; i<nc; i++) {  
    11.             *data++= *data&mask + div/2;  
    12.             } // end of row                   
    13.       }  
    14. }  


    方法四:指针运算

    方法四和方法三量化处理的方法相同,不同的是用指针运算代替*++操作。

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // direct pointer arithmetic  
    2. void colorReduce4(cv::Mat &image, int div=64) {  
    3.       int nr= image.rows; // number of rows  
    4.       int nc= image.cols * image.channels(); // total number of elements per line  
    5.       int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));  
    6.       int step= image.step; // effective width  
    7.       // mask used to round the pixel value  
    8.       uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0  
    9.       // get the pointer to the image buffer  
    10.       uchar *data= image.data;  
    11.       for (int j=0; j<nr; j++) {  
    12.           for (int i=0; i<nc; i++) {  
    13.             *(data+i)= *data&mask + div/2;  
    14.             } // end of row                   
    15.             data+= step;  // next line  
    16.       }  
    17. }  


    方法五:.ptr、*++、位运算以及image.cols * image.channels()

    这种方法就是没有计算nc,基本是个充数的方法。

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // using .ptr and * ++ and bitwise with image.cols * image.channels()  
    2. void colorReduce5(cv::Mat &image, int div=64) {  
    3.       int nr= image.rows; // number of rows  
    4.       int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));  
    5.       // mask used to round the pixel value  
    6.       uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0  
    7.       for (int j=0; j<nr; j++) {  
    8.           uchar* data= image.ptr<uchar>(j);  
    9.           for (int i=0; i<image.cols * image.channels(); i++) {  
    10.             *data++= *data&mask + div/2;  
    11.             } // end of row                   
    12.       }  
    13. }  

     

    方法六:连续图像

    Mat提供了isContinuous()函数用来查看Mat在内存中是不是连续存储,如果是则图片被存储在一行中。

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // using .ptr and * ++ and bitwise (continuous)  
    2. void colorReduce6(cv::Mat &image, int div=64) {  
    3.       int nr= image.rows; // number of rows  
    4.       int nc= image.cols * image.channels(); // total number of elements per line  
    5.       if (image.isContinuous())  {  
    6.           // then no padded pixels  
    7.           nc= nc*nr;   
    8.           nr= 1;  // it is now a 1D array  
    9.        }  
    10.       int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));  
    11.       // mask used to round the pixel value  
    12.       uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0  
    13.       for (int j=0; j<nr; j++) {  
    14.           uchar* data= image.ptr<uchar>(j);  
    15.           for (int i=0; i<nc; i++) {  
    16.             *data++= *data&mask + div/2;  
    17.             } // end of row                   
    18.       }  
    19. }  


    方法七:continuous+channels

    与方法六基本相同,也是充数的。

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // using .ptr and * ++ and bitwise (continuous+channels)  
    2. void colorReduce7(cv::Mat &image, int div=64) {  
    3.       int nr= image.rows; // number of rows  
    4.       int nc= image.cols ; // number of columns  
    5.       if (image.isContinuous())  {  
    6.           // then no padded pixels  
    7.           nc= nc*nr;   
    8.           nr= 1;  // it is now a 1D array  
    9.        }  
    10.       int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));  
    11.       // mask used to round the pixel value  
    12.       uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0  
    13.       for (int j=0; j<nr; j++) {  
    14.           uchar* data= image.ptr<uchar>(j);  
    15.           for (int i=0; i<nc; i++) {  
    16.             *data++= *data&mask + div/2;  
    17.             *data++= *data&mask + div/2;  
    18.             *data++= *data&mask + div/2;  
    19.             } // end of row                   
    20.       }  
    21. }  


    方法八:Mat _iterator

    真正有区别的方法来啦,用Mat提供的迭代器代替前面的[]操作符或指针,血统纯正的官方方法~

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // using Mat_ iterator   
    2. void colorReduce8(cv::Mat &image, int div=64) {  
    3.       // get iterators  
    4.       cv::Mat_<cv::Vec3b>::iterator it= image.begin<cv::Vec3b>();  
    5.       cv::Mat_<cv::Vec3b>::iterator itend= image.end<cv::Vec3b>();  
    6.       for ( ; it!= itend; ++it) {  
    7.         (*it)[0]= (*it)[0]/div*div + div/2;  
    8.         (*it)[1]= (*it)[1]/div*div + div/2;  
    9.         (*it)[2]= (*it)[2]/div*div + div/2;  
    10.       }  
    11. }  

     

    方法九:Mat_ iterator 和位运算

    把方法八中的乘除法换成位运算。

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // using Mat_ iterator and bitwise  
    2. void colorReduce9(cv::Mat &image, int div=64) {  
    3.       // div must be a power of 2  
    4.       int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));  
    5.       // mask used to round the pixel value  
    6.       uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0  
    7.       // get iterators  
    8.       cv::Mat_<cv::Vec3b>::iterator it= image.begin<cv::Vec3b>();  
    9.       cv::Mat_<cv::Vec3b>::iterator itend= image.end<cv::Vec3b>();  
    10.       for ( ; it!= itend; ++it) {  
    11.         (*it)[0]= (*it)[0]&mask + div/2;  
    12.         (*it)[1]= (*it)[1]&mask + div/2;  
    13.         (*it)[2]= (*it)[2]&mask + div/2;  
    14.       }  
    15. }  


    方法十:MatIterator_

    和方法八基本相同。

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // using MatIterator_   
    2. void colorReduce10(cv::Mat &image, int div=64) {  
    3.       cv::Mat_<cv::Vec3b> cimage= image;  
    4.       cv::Mat_<cv::Vec3b>::iterator it=cimage.begin();  
    5.       cv::Mat_<cv::Vec3b>::iterator itend=cimage.end();  
    6.       for ( ; it!= itend; it++) {   
    7.         (*it)[0]= (*it)[0]/div*div + div/2;  
    8.         (*it)[1]= (*it)[1]/div*div + div/2;  
    9.         (*it)[2]= (*it)[2]/div*div + div/2;  
    10.       }  
    11. }  

     

    方法十一:图像坐标

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // using (j,i)  
    2. void colorReduce11(cv::Mat &image, int div=64) {  
    3.       int nr= image.rows; // number of rows  
    4.       int nc= image.cols; // number of columns  
    5.       for (int j=0; j<nr; j++) {  
    6.           for (int i=0; i<nc; i++) {  
    7.                   image.at<cv::Vec3b>(j,i)[0]=     image.at<cv::Vec3b>(j,i)[0]/div*div + div/2;  
    8.                   image.at<cv::Vec3b>(j,i)[1]=     image.at<cv::Vec3b>(j,i)[1]/div*div + div/2;  
    9.                   image.at<cv::Vec3b>(j,i)[2]=     image.at<cv::Vec3b>(j,i)[2]/div*div + div/2;  
    10.             } // end of row                   
    11.       }  
    12. }  


    方法十二:创建输出图像

    之前的方法都是直接修改原图,方法十二新建了输出图像,主要用于后面的时间对比。

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // with input/ouput images  
    2. void colorReduce12(const cv::Mat &image, // input image   
    3.                  cv::Mat &result,      // output image  
    4.                  int div=64) {  
    5.       int nr= image.rows; // number of rows  
    6.       int nc= image.cols ; // number of columns  
    7.       // allocate output image if necessary  
    8.       result.create(image.rows,image.cols,image.type());  
    9.       // created images have no padded pixels  
    10.       nc= nc*nr;   
    11.       nr= 1;  // it is now a 1D array  
    12.       int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));  
    13.       // mask used to round the pixel value  
    14.       uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0  
    15.       for (int j=0; j<nr; j++) {  
    16.           uchar* data= result.ptr<uchar>(j);  
    17.           const uchar* idata= image.ptr<uchar>(j);  
    18.           for (int i=0; i<nc; i++) {  
    19.             *data++= (*idata++)&mask + div/2;  
    20.             *data++= (*idata++)&mask + div/2;  
    21.             *data++= (*idata++)&mask + div/2;  
    22.           } // end of row                   
    23.       }  
    24. }  


    方法十三:重载操作符

    Mat重载了+&等操作符,可以直接将两个Scalar(B,G,R)数据进行位运算和数学运算。

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. // using overloaded operators  
    2. void colorReduce13(cv::Mat &image, int div=64) {  
    3.       int n= static_cast<int>(log(static_cast<double>(div))/log(2.0));  
    4.       // mask used to round the pixel value  
    5.       uchar mask= 0xFF<<n; // e.g. for div=16, mask= 0xF0  
    6.       // perform color reduction  
    7.       image=(image&cv::Scalar(mask,mask,mask))+cv::Scalar(div/2,div/2,div/2);  
    8. }  


    时间对比

    通过迭代二十次取平均时间,得到每种方法是运算时间如下。

    可以看到,指针*++访问和位运算是最快的方法;而不断的计算image.cols*image.channles()花费了大量重复的时间;另外迭代器访问虽然安全,但性能远低于指针运算;通过图像坐标(j,i)访问时最慢的,使用重载操作符直接运算效率最高。


    展开全文
  • 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



    展开全文
  • 假设类型为CV_8UC3,则可以执行以下操作:for(int i = 0; i < foo.rows; i++){for(int j = 0; j < foo.cols; j++){Vec3b bgrPixel = foo.at(i, j);...另外,不要忘记OpenCV在内部将内容存...

    假设类型为CV_8UC3,则可以执行以下操作:

    for(int i = 0; i < foo.rows; i++)

    {

    for(int j = 0; j < foo.cols; j++)

    {

    Vec3b bgrPixel = foo.at(i, j);

    // do something with BGR values...

    }

    }

    这是Vec3b的文档。希望有帮助!另外,不要忘记OpenCV在内部将内容存储为BGR而不是RGB。

    编辑:

    出于性能原因,您可能需要使用对数据缓冲区的直接访问才能处理像素值:

    这是您可能要进行的操作:

    uint8_t* pixelPtr = (uint8_t*)foo.data;

    int cn = foo.channels();

    Scalar_ bgrPixel;

    for(int i = 0; i < foo.rows; i++)

    {

    for(int j = 0; j < foo.cols; j++)

    {

    bgrPixel.val[0] = pixelPtr[i*foo.cols*cn + j*cn + 0]; // B

    bgrPixel.val[1] = pixelPtr[i*foo.cols*cn + j*cn + 1]; // G

    bgrPixel.val[2] = pixelPtr[i*foo.cols*cn + j*cn + 2]; // R

    // do something with BGR values...

    }

    }

    或者:

    int cn = foo.channels();

    Scalar_ bgrPixel;

    for(int i = 0; i < foo.rows; i++)

    {

    uint8_t* rowPtr = foo.row(i);

    for(int j = 0; j < foo.cols; j++)

    {

    bgrPixel.val[0] = rowPtr[j*cn + 0]; // B

    bgrPixel.val[1] = rowPtr[j*cn + 1]; // G

    bgrPixel.val[2] = rowPtr[j*cn + 2]; // R

    // do something with BGR values...

    }

    }

    展开全文
  • opencv mat 单通道图像获取 像素值

    千次阅读 2017-09-22 16:02:31
    mat at 函数获取 pixel_val = binary_img.at(i,j); 方法二 通过指针获取 pixel_val = (int)(*(binary_img.data + (int)(binary_img.rows * j) +  (int)j); 方法三: uchar* p; p = binary_
  • OpenCV如何扫描图像、利用查找表和计时目的我们将探索以下问题的答案:如何遍历图像中的每一个像素OpenCV的矩阵是如何存储的?如何测试我们所实现算法的性能?查找表是什么?为什么要用它?测试用例这里我们测试...
  • 1: 输出一个Mat对象的像素自定义一个Mat 对象,然后输出像素值(像素值基本都在 0 – 255 之间 ,图像为三通道)代码public static void F1(){Scalar s = new Scalar(0, 0, 255); //定义一个三通道颜色(红色)Mat m = ...
  • 本文实现功能:利用opencv获取鼠标左键点击位置图像的像素值(RGB像) vs2015+opencv3.1 #include<opencv2> #include using namespace std; using namespace cv; void on_mouse(int EVENT, int x, int y, int ...
  • 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++) {
  • #include ...void setSaltNoise(Mat& image , int count) { //以当前时间为产生随机数的种子 srand((unsigned)time(NULL)); for(int i=0;i;i++) { //产生随机的坐标,该坐标不能超过图像的范围,
  • 本文转自...   ...OpenCV OpenCV像素值获取与设置 Fn 1 : 使用 Mat 中对矩阵元素的地址定位的知识 (参考博文:OpenCV中对Mat里面depth,dims,channels,step,data,elemS
  • Mat Class主要包括两部个数据部分:一个是matrix header(包括matrix的大小尺寸,储存方法,储存地址等等..),另一个是指向存储像素值的矩阵的指针。Opencv中对Mat的复制分为两种,Mat A, C; ...
  • Mat rgb,hsv; cvtColor(rgb, hsv, COLOR_BGR2HSV); //RGB B = image.at<Vec3b>(y, x)[0]; G = image.at<Vec3b>(y, x)[1]; R = image.at<Vec3b>(y, x)[2]; //HSV H = static_cast<int>...
  • opencv--读取Mat像素

    千次阅读 2019-09-11 16:15:36
    Mat src = imread("1.jpg"); int rows = src.rows; int cols = src.cols; for (int i = 0; i < rows; i++) { uchar* d = src.ptr<uchar>(i); //获取第i行的首地址 for (int j =...
  • 创建存储三通道图像的矩阵: Mat img(Size(70,70),CV_8U3C,Scalar(0,0,0)灰度图(8UC1)的...intensity.val[0]中保存图像的灰度值(0-255),另外intensity.val[1],intensity.val[2]为0获取3通道图像像素值:Vec3b int
  • 作为OpenCV基础知识中的重中之重,像素值的读写需要我们很用心的掌握。 1、读取原图 const char filename[] = "/Users/linwang/Desktop/Lena.png"; Mat Im = imread(filename); cout; cout<<"Im.rows =
  • OPENCV系列博客主要记录自己学习OPENCV的历程,以及存储已经实现的代码,以备后续回顾使用,代码中包含了主要的备注。 Mat类型的使用方法 #include <opencv2/opencv.hpp> #include <iostream> ...
  • 1. Access pixel value in Mat Image For a single channel grey scale image (type 8UC1). Scalar intensity = img.atuchar>(Point(x, y)); For a 3 channel image with BGR color ordering
  • 在上一次中的最后,提到了修改图像数据的操作。但是,这种操作是比较慢的。下面说一下访问图像数据的几种方式。毕竟在实际的图像处理中...例9-1 第一种修改方式,使用at访问修改像素值,这就是上次的例8,现在加上处...
  • channels:通道,矩阵中的每一个矩阵元素拥有的的个数,比如说 3 * 4 矩阵中一共 12 个元素,如果每个元素有三个,那么就说这个矩阵是 3 通道的,即 channels = 3。常见的是一张彩色图片有红、绿、蓝三个通道。 ...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 176
精华内容 70
关键字:

matopencv获取像素值