精华内容
下载资源
问答
  • 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)访问时最慢的,使用重载操作符直接运算效率最高。


    展开全文
  • Mat 像素获取

    2017-11-12 19:48:22
    VS2013+Opencv2.4.9 获取图像的像素值。像素的赋值、遍历像素
  • 1: 输出一个Mat对象的像素自定义一个Mat 对象,然后输出像素值(像素值基本都在 0 – 255 之间 ,图像为三通道)代码public static void F1(){Scalar s = new Scalar(0, 0, 255); //定义一个三通道颜色(红色)Mat m = ...

    1: 输出一个Mat对象的像素

    自定义一个Mat 对象,然后输出像素值(像素值基本都在 0 – 255 之间 ,图像为三通道)

    代码

    public static void F1()

    {

    Scalar s = new Scalar(0, 0, 255); //定义一个三通道颜色(红色)

    Mat m = new Mat(100, 100, MatType.CV_8UC3, s); //矩阵数据类型(深度和通道数) MatType

    /*

    * 小图像的每一个像素值我们都是知道的,可以输出查看,验证算法正确性,然后在ran大图

    */

    //打印 100 * 100 Mat对象像素值

    for (int i = 0; i < m.Height; i++)

    {

    for (int j = 0; j < m.Width; j++)

    {

    Vec3b color = m.Get(i, j); //new Vec3b(); 颜色通道类型 (字节的三元组),直接视同Get泛型方法返回指定类型

    //单独获取指定通道像素

    //color.Item0= m.Get(i, j).Item0; //R

    //color.Item1 = m.Get(i, j).Item1; //G

    //color.Item2 = m.Get(i, j).Item2; //B

    Console.Write(color.Item0 + " " + color.Item1 + " " + color.Item2);

    Console.WriteLine(" "); //输出一个换行

    }

    }

    using (new Window("M", WindowMode.AutoSize, m))

    {

    Cv2.WaitKey(0);

    }

    }

    100*100 个像素大小的图像不是很大,颜色在代码值指定了(0,0,255)三通道的颜色值,打印出来都只是(0,0,255)。

    下面读取一张彩色图片试一下:

    public static void F1(string path)

    {

    //Scalar s = new Scalar(0, 0, 255);

    //Mat m = new Mat(100, 100, MatType.CV_8UC3, s); //矩阵数据类型(深度和通道数) MatType

    Mat m = new Mat(path, ImreadModes.AnyColor | ImreadModes.AnyDepth);

    /*

    * 小图像的每一个像素值我们都是知道的,可以输出查看,验证算法正确性,然后在ran大图

    */

    //打印 100 * 100 Mat对象像素值

    for (int i = 0; i < m.Height; i++)

    {

    for (int j = 0; j < m.Width; j++)

    {

    Vec3b color = m.Get(i, j); //new Vec3b(); 颜色通道类型(字节的三元组) ,直接视同Get泛型方法返回指定类型

    //单独获取指定通道像素

    //color.Item0= m.Get(i, j).Item0; //R

    //color.Item1 = m.Get(i, j).Item1; //G

    //color.Item2 = m.Get(i, j).Item2; //B

    Console.Write(color.Item0 + " " + color.Item1 + " " + color.Item2);

    Console.WriteLine(" "); //输出一个换行

    }

    }

    Console.WriteLine("图像高度:{0}", m.Height);

    Console.WriteLine("图像宽度:{0}", m.Width);

    using (new Window("M", WindowMode.AutoSize, m))

    {

    Cv2.WaitKey(0);

    }

    }

    这张图比较大,输出像素要费点时间,最后输出了图像的高度和宽度 480 * 512 =245760 多个像素点。 像素点的值 都在0 --255之间且是正数。

    2:使用指针获取一个像素值和图像的行列值

    代码 在C#中使用指针方法要加 unsafe , Main函数也要加

    unsafe static void Main(string[] args)

    {

    string imagePath = @"E:\image\lenna.png"; //图片加载路径

    Function1(imagePath);

    }

    ///

    /// 操作指针要加 unsafe

    ///

    unsafe public static void Function1(string path)

    {

    Mat src = new Mat(path, ImreadModes.AnyColor);

    if (src.Empty()) //判断 MAT对象是否为空,不过在C#中好像没用,因为在mat对象初始化的时候找不到图片就直接抛出异常了,但是C++中可以用来判断。

    {

    Console.WriteLine("加载图像出错");

    return;

    }

    /*

    C++:

    Mat dst;

    dst=Mat(src.Size(), src.Type());

    dst=Scalar(127,0,255);

    */

    //Scalar s = new Scalar(127, 0, 255); //创建一个颜色标量(RED)C# 中是一个对象

    // Mat dst = new Mat(src.Size(), src.Type(),s);//创建一个与src 的大小和类型一直的图片矩阵

    //Mat dst = src.Clone(); //克隆:得到一个完全拷贝的对象

    Mat dst = new Mat();

    src.CopyTo(dst); //拷贝一个与克隆类似,但是dst必须先new出来

    //Cv2.CvtColor(src, dst, ColorConversionCodes.BGRA2GRAY); //转为灰度图

    Console.WriteLine("InputImage 颜色通道:{0}", src.Channels()); //颜色通道数

    Console.WriteLine("Create 颜色通道:{0}", dst.Channels()); //颜色通道数

    //指针获取值(根据下标),第一个像素值

    IntPtr c = dst.Ptr(0); //Mat对象的 Ptr方法:返回指向指定矩阵行的指针。

    byte* c1 = (byte*)c; //像素值在C#中是byte类型 ,在C++中是 uchar类型

    //byte* cc = (byte*)dst.Ptr(0);

    Console.WriteLine("第一个像素值:{0}", *c1);

    int row = dst.Rows; //行

    int clo = dst.Cols; //列

    Console.WriteLine("Rows :{0} ;Cols :{1}", row, clo);

    using (new Window("Create", WindowMode.FreeRatio, dst))

    using (new Window("InputImage", WindowMode.FreeRatio, src))

    {

    Cv2.WaitKey(0);

    }

    }

    到此这篇关于OpenCvSharp实现Mat对象简单的像素操作的文章就介绍到这了,更多相关OpenCvSharp Mat对象像素操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    展开全文
  • 假设类型为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基础知识中的重中之重,像素值的读写需要我们很用心的掌握。 1、读取原图 const char filename[] = "/Users/linwang/Desktop/Lena.png"; Mat Im = imread(filename); cout; cout<<"Im.rows =

    作为OpenCV基础知识中的重中之重,像素值的读写需要我们很用心的掌握。

    1、读取原图


        const char filename[] = "/Users/linwang/Desktop/Lena.png";
        Mat Im = imread(filename);
        cout<<"Im.dims  = "<<Im.dims<<endl;
        cout<<"Im.rows  = "<<Im.rows<<endl;
        cout<<"Im.cols  = "<<Im.cols<<endl;
        cout<<"Im.channels = "<<Im.channels()<<endl;
        cout<<"Im.step[0] = " <<Im.step[0]<<endl;
        cout<<"Im.step[1] = " <<Im.step[1]<<endl;
        cout<<"Im.Elemsize = "<<Im.elemSize()<<endl;    //一个像素点的大小  CV_8U3C=1*3
        cout<<"Im.Elemsize1 = "<<Im.elemSize1()<<endl;  //数据类型的大小 UCHAR = 1 (ElemSize / Channel)
        namedWindow("Old-Lena");
        imshow("Old-Lena", Im);






    2、最朴素的指针偏移,读取像素点值,修改Lena


        /*2.采用最朴素的方式修改Lena,获得Test*/
        Mat test_im = Im.clone();
        for (int i = 0; i<test_im.rows; i++)
        {
            uchar * ptr = test_im.data + i * test_im.step;  //step 是一行的数据长度
            for(int j = 0;j<test_im.step;j++)
            {
                *(ptr + j)     = i%255;  //Bule
            }
        }
        cvNamedWindow("Test-Lena");
        imshow("Test-Lena", copy_im);


    3、采用C++的Vec来读取像素点数据


       /*1.采用C++模版 STL的方式 修改Lena原图,得到New*/
        Mat copy_im = Im.clone();
        for (int i = 0; i<copy_im.rows; i++)
        {
            for(int j = 0;j<copy_im.cols;j++)
            {
                Vec3b pixel;
                pixel[0] = i%255; //Blue
                pixel[1] = j%255; //Green
                pixel[2] = 0;     //Red
                copy_im.at<Vec3b>(i,j) = pixel;
            }
        }
        cvNamedWindow("New-Lena");
        imshow("New-Lena", copy_im);






    4、迭代器方式遍历图像

        /*3.迭代器方法遍历图像像素*/
        Mat IterIm = Im.clone();
        MatIterator_<Vec3b> IterBegin,IterEnd;   //迭代器
        for(IterBegin = IterIm.begin<Vec3b>(),IterEnd = IterIm.end<Vec3b>();IterBegin!=IterEnd;++IterBegin)
        {
            (*IterBegin)[0] = rand()%255;
            (*IterBegin)[1] = rand()%255;
            (*IterBegin)[2] = rand()%255;
        }
        cvNamedWindow("IterImg");
        imshow("IterImg", IterIm);
        cvWaitKey(0);


    展开全文
  • 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_
  • 常用的基本函数 Mat矩阵的定义 data:Mat对象中的一个指针,指向内存中存放矩阵数据的一块内存 (uchar* data) dims:Mat所代表的矩阵的维度,如 3 * 4 的矩阵为 2 维, 3 * 4 * ...depth:深度,即每一个像素的位数(b
  • Mat Class主要包括两部个数据部分:一个是matrix header(包括matrix的大小尺寸,储存方法,储存地址等等..),另一个是指向存储像素值的矩阵的指针。Opencv中对Mat的复制分为两种,Mat A, C; ...
  • OpenCV如何扫描图像、利用查找表和计时目的我们将探索以下问题的答案:如何遍历图像中的每一个像素OpenCV的矩阵值是如何存储的?如何测试我们所实现算法的性能?查找表是什么?为什么要用它?测试用例这里我们测试...
  • Mat像素获取与赋值

    万次阅读 2018-06-15 14:55:04
    算机视觉中,图像的读取是图像处理的基础,图像就是一系列像素值,OpenCV使用数据结构cv::Mat来存储图像。cv::Mat是一个矩阵类,矩阵中每一个元素都代表一个像素,对于灰度图像,像素用8位无符号数,0表示黑色,255...
  • 04_OpenCv像素取反

    2018-10-04 23:01:58
    OpenCv像素取反 一.Mat像素取反 1.将bitmap对象转换为mat对象 2.通过Mat对象的cols()方法和rows()方法,获取图片的宽高 3.获取图片的通道数 4.分配一个字节数组,其长度为图片的通道数 5.循环遍历Mat对象的...
  • #include <iostream> #include <opencv2/opencv.hpp> #include<opencv2/highgui/highgui.hpp> using namespace std;...using namespace cv;... Mat srcImg; srcImg = imread("Leno.jp...
  • Mat Img = imread(filename); cout三维图像的维度:"; cout三维图像的通道数:"(); cout三维图像的宽:"; cout三维图像的高:"; cout数据类型的大小 "(); cout存放一个列元素的大小:"(); cout[0] =...
  • OpenCV(三) Mat像素操作

    千次阅读 2019-03-27 17:11:51
    获取图像数据的时候,知道Mat的类型与通道数目至关重要,根据Mat的类型与通道数目,开辟适当大小的内存空间,然后通过get方法就可以循环实现每个像素点值的读取、修改,然后再通过put方法修改与Mat对应的数据部分...
  • 例如果效率很重要,那么迭代cv::Mat对象中的像素的快速方法是使用其ptr(int r)方法来获得指向行r (从0开始的索引)的开头的指针。根据矩阵类型,指针将具有不同的模板。对于CV_8UC1 : uchar* ptr = image.ptr(r);...
  • opencv获取图像像素方法主要是3种,分别是指针风格、迭代器风格、动态地址风格,代码如下: Mat image = imread(strPic); //指针 int iColumn = (image.cols)*(image.channels()); int iRow = image.rows; for...
  • 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>...
  • 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
  • #include ...void setSaltNoise(Mat& image , int count) { //以当前时间为产生随机数的种子 srand((unsigned)time(NULL)); for(int i=0;i;i++) { //产生随机的坐标,该坐标不能超过图像的范围,
  • OpenCV 获取像素值的几个方法

    千次阅读 2014-03-06 14:06:33
    Fn 1 : 使用 Mat 中对矩阵元素的地址定位的知识 (参考博文:OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解) Code 1 : int main
  • 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 =...
  • 本文实现功能:利用opencv获取鼠标左键点击位置图像的像素值(RGB像) vs2015+opencv3.1 #include<opencv2> #include using namespace std; using namespace cv; void on_mouse(int EVENT, int x, int y, int ...
  • 如果有两个Mat 图像,一个是灰度图grayimg另一个是彩色图, 常用如下...//获取第 i 行首像素指针 uchar * p = grayim.ptr(i); //对第 i 行的每个像素(byte)操作 for( int j = 0; j ; ++j ) p[j] = (i+j)%255; } //遍历
  • 创建存储三通道图像的矩阵: 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--获取Mat图像数据的方式

    千次阅读 2019-03-12 19:21:20
    如果想要获取指定坐标像素的值,可以采用Mat的成员函数at(j,i)来获取坐标()处的像素值。试例代码如下: //用Mat的成员函数访问图像数据 if (image.channels()==1) { image.at&lt;uchar&gt;(j,i)=255...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 264
精华内容 105
关键字:

matopencv像素获取