精华内容
下载资源
问答
  • 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 java Mat 基本操作像素点(7)

    千次阅读 2020-08-31 16:56:08
    前面我们说到了用Mat类进行行列式的计算,可能在OPenCv中不算太实用,那么今天我们介绍一个比较使用的,图片中的像素点 我们知道OpenCv当我们read一个图片的时候,返回的结果是一个Mat 一. Mat的结构 Mat的结构是...

    前面我们说到了用Mat类进行行列式的计算,可能在OPenCv中不算太实用,那么今天我们介绍一个比较使用的,图片中的像素点

    我们知道OpenCv当我们read一个图片的时候,返回的结果是一个Mat

    一. Mat的结构

    Mat的结构是怎样的,我们来看一下:

    1. dataAddr 在C++中有指针的概念,指针是以一个变量,指向内存中存储空间(可能是联系的,也可能不是连续的),我们使用opencv,java在本质上还是使用的C++

    2,nativeObj 相当于是本地的一个对象

    3.isSubmat 是否为子矩阵

    4.isCont 是否联系存储

    5.512*512*CV_UC3  标识size和type

    二.如何画一条直线,如图所示:

    直接看代码:

    	public static void main(String[] args) throws IOException {
    
    		try {
    			ResourceBundle bundle = ResourceBundle.getBundle("opencv");
    			String opencvDllName = bundle.getString("opencv.dllpath");
    			System.load(opencvDllName);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		Mat truth = new Mat(500, 500, CvType.CV_8UC3);
    		
    		byte [] line=new byte[truth.channels()*truth.width()];
    		
    		
    		for(int i=0;i<line.length;i++) {
    			line[i]=125;
    		}
    		truth.put(250, 0, line);
    		
    		
    		HighGui.imshow("原图", truth);
    		HighGui.waitKey(0);
    }

    上面代码中,我们创建了一个byte数组,然后放到mat上就把直线显示出来了

    主要用到了Mat中的put方法:

    put(250,0,line)

    250 标识第250行

    0 标识所有的列(特殊 0标识所有的列)

    line标识 数组

    三.图片反色练习

    	public static Mat MatInvert(Mat mat) {
    		int channels = mat.channels();
    		int b, g, r;
    		for (int j = 0; j < mat.height(); j++) {
    			for (int i = 0; i < mat.width(); i++) {
    				byte[] temp = new byte[channels];
    				mat.get(j, i, temp);
    				b = temp[0] & 0xff;
    				g = temp[1] & 0xff;
    				r = temp[2] & 0xff;
    
    				// 修改像素点
    				b = 255 - b;
    				g = 255 - g;
    				r = 255 - r;
    
    				// 写入
    				temp[0] = (byte) b;
    				temp[1] = (byte) g;
    				temp[2] = (byte) r;
    				mat.put(j, i, temp);
    			}
    		}
    		return mat;
    
    	}
    
    	public static Mat MatInvert2(Mat mat) {
    		int channels = mat.channels();
    		byte[] temp = new byte[channels * mat.width()];
    		for (int j = 0; j < mat.height(); j++) {
    			mat.get(j, 0, temp);
    			for (int i = 0; i < temp.length; i++) {
    				int pv = temp[i] & 0xff;
    				temp[i] = (byte) (255 - pv);
    
    			}
    			mat.put(j, 0, temp);
    		}
    		return mat;
    	}
    
    	public static Mat MatInvert3(Mat mat) {
    		int channels = mat.channels();
    		byte[] temp = new byte[channels * mat.width() * mat.height()];
    		mat.get(0, 0, temp);
    		for(int i=0;i<temp.length;i++) {
    			temp[i]=(byte)(255-temp[i]&0xff);
    			
    		}
    		mat.put(0, 0, temp);
    		return mat;
    	}

     

    测试结果:

     上面主要学习的是Mat的put方法和get方法,获取到具体的像素点,或者获取到行像素,全部的像素存入byte数组中,通过改变byte数组的值,来实现图片的改变,特别记住的是put( 0,0,byte) 里面的0 是所有的行或者列

    希望对你有所帮助

     

    展开全文
  • 关于OpenCV Mat读取像素

    千次阅读 2017-11-13 21:48:27
    最近开始使用OPenCV读取图像像素值,并做处理,裁剪出ROI区域,并做保存。 对于Mat类生成的对象,包含诸多属性,Mat.rows, Mat.cols分别表示图像的heighten和width属性。 Mat的坐标系从左上角(0,0)开始,到右下角...

    最近开始使用OPenCV读取图像像素值,并做处理,裁剪出ROI区域,并做保存。

    对于Mat类生成的对象,包含诸多属性,Mat.rows, Mat.cols分别表示图像的heighten和width属性。

    Mat的坐标系从左上角(0,0)开始,到右下角(Mat.rows, Mat.cols)。采集像素按照rows为X轴,cols为Y轴,提取像素的模式如:

    mat.at<char>(mat.rows, mat.cols), 与正常提取数据的方式相反的。主要原因是opencv保存数据的方式是按行保存,不像MATLAB一样按列保存的方式进行。

    对于Rect对象的使用,需要注意,Rect有四个参数,x, y, width, height.四个参数是按照正常的坐标系工作的,width为X轴, height方向为Y轴,与读取像素的方式相反。

    例如:我需要读取二值化以后的手部区域图像的

    代码如下:

    for(int i = 0; i < oldImg.rows; i++)//rows->height->Y
    {
    for (int j = 0; j < oldImg.cols; j++)//cols->width->X//提取像素值,按照i为rows, j为cols。
    {


    if (oldImg.at<uchar>(i, j) != 0)
    {

    if ((upperleftX == 0) || (upperleftX != 0 && upperleftX > j))
    {
    upperleftX = j;

    }
    if ((upperleftY == 0) || (upperleftY != 0 && upperleftY > i))
    {
    upperleftY = i;
    }


    if ((bottomrightX == 0) || (bottomrightX != 0 && bottomrightX < j))
    {
    bottomrightX = j;
    }
    if ((bottomrightY == 0) || (bottomrightY != 0 && bottomrightY < i))
    {
    bottomrightY = i;
    }
    }


    }


    }

    clipImg = oldImg(Rect(upperleftX, upperleftY,   (bottomrightX - upperleftX),(bottomrightY - upperleftY)));//提取需要的区域,坐标系是正常坐标系,水平X,竖直Y

    展开全文
  • 常用的基本函数 Mat矩阵的定义 data:Mat对象中的一个指针,指向内存中存放矩阵数据的一块内存 (uchar* data) dims:Mat所代表的矩阵的维度,如 3 * 4 的矩阵为 2 维, 3 * 4 * ...depth:深度,即每一个像素的位数(b

    常用的基本函数
    在这里插入图片描述
    在这里插入图片描述

    Mat矩阵的定义

    data:Mat对象中的一个指针,指向内存中存放矩阵数据的一块内存 (uchar* data)

    dims:Mat所代表的矩阵的维度,如 3 * 4 的矩阵为 2 维, 3 * 4 * 5 的为3维

    channels:通道,矩阵中的每一个矩阵元素拥有的值的个数,比如说 3 * 4 矩阵中一共 12 个元素,如果每个元素有三个值,那么就说这个矩阵是 3 通道的,即 channels = 3。常见的是一张彩色图片有红、绿、蓝三个通道。

    depth:深度,即每一个像素的位数(bits),在opencv的Mat.depth()中得到的是一个 0 – 6 的数字,分别代表不同的位数:enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 }; 可见 0和1都代表8位, 2和3都代表16位,4和5代表32位,6代表64位;

    step:是一个数组,定义了矩阵的布局,具体见下面图片分析,另外注意 step1 (step / elemSize1),M.step[m-1] 总是等于 elemSize,M.step1(m-1)总是等于 channels;

    elemSize : 矩阵中每一个元素的数据大小,如果Mat中的数据的数据类型是 CV_8U 那么 elemSize = 1,CV_8UC3 那么 elemSize = 3,CV_16UC2 那么 elemSize = 4;记住另外有个 elemSize1 表示的是矩阵中数据类型的大小,即 elemSize / channels 的大小

    获取某一点的像素点

    最快的获取形式

    Mat& ScanImageAndReduceC(Mat& I, const uchar* const table)
    {
    	// accept only char type matrices
    	CV_Assert(I.depth() != sizeof(uchar));
    	int channels = I.channels();
    	int nRows = I.rows ;
    	int nCols = I.cols* channels;
    	if (I.isContinuous())
    	{
    		nCols *= nRows;
    		nRows = 1;
    	}
    	int i,j;
    	uchar* p;
    	for( i = 0; i < nRows; ++i)
    	{
    		p = I.ptr<uchar>(i);
    		for ( j = 0; j < nCols; ++j)
    		{
    			p[j] = table[p[j]];
    		}
    	}
    	return I;
    }
    

    获其中一个点的函数

    //获得某点像素值
    int get_pixel(Mat & img, Point pt) {
    	int width = img.cols; //图片宽度
    	int height = img.rows; //图片宽度t;//图片高度
    	// x 是 列 , y 是 行
    	uchar* ptr = (uchar*) img.data + pt.y * width; //获得灰度值数据指针
    	int intensity = ptr[pt.x];
    	return intensity;
    }
    

    Mat最直接的访问方法是通过.ptr<>函数得到一行的指针,并用[]操作符访问某一列的像素值。
    注意不可以像matlab中直接‘img[1][1]’来获取第一个元素,因为openCV应该没有重构这个[i][j]操作符。

    
    // using .ptr and []
    void colorReduce0(cv::Mat &image, int div=64) {
    	  int nr= image.rows; // number of rows
    	  int nc= image.cols * image.channels(); // total number of elements per line
          for (int j=0; j<nr; j++) {
    		  uchar* data= image.ptr<uchar>(j);
              for (int i=0; i<nc; i++) {
                      data[i]= data[i]/div*div + div/2;
                }                  
          }
    

    灰度图存储可视化:
    在这里插入图片描述
    三通道彩色图存储可视化:
    在这里插入图片描述

    这是使用opencv中自己定义的at函数来取像素值,代码如下,函数更为简洁,但是速度方面却更慢。这个例子也可以看出opencv的图像存储格式是HWC,其中最后的channel是按照BGR的格式来存放的,通过【0】来获取Blue通道的值。

    // using (j,i)
    void colorReduce11(cv::Mat &image, int div=64) {
    	  int nr= image.rows; // number of rows
    	  int nc= image.cols; // number of columns
          for (int j=0; j<nr; j++) {
              for (int i=0; i<nc; i++) {
                      image.at<cv::Vec3b>(j,i)[0]=	 image.at<cv::Vec3b>(j,i)[0]/div*div + div/2;
                      image.at<cv::Vec3b>(j,i)[1]=	 image.at<cv::Vec3b>(j,i)[1]/div*div + div/2;
                      image.at<cv::Vec3b>(j,i)[2]=	 image.at<cv::Vec3b>(j,i)[2]/div*div + div/2;
                } // end of row                 
          }
    }
    

    在这里插入图片描述
    在这里插入图片描述

    不同获取方式的速度对比:https://blog.csdn.net/xiaowei_cqu/article/details/19839019

    关于step和elemSize的讲解:https://blog.csdn.net/dcrmg/article/details/52294259?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

    展开全文
  • Android OpenCV(二):Mat像素操作

    千次阅读 2020-01-22 08:29:32
    Mat Mat类用于表示一个多维的单通道或者多通道的稠密数组。...Mat对象中包含了图像的各种基本信息与图像像素数据。Mat是由头部与数据部分组成的,其中头部还包含一个指向数据的指针。 Mat方法 方法 使用 p...
  • 作为OpenCV基础知识中的重中之重,像素值的读写需要我们很用心的掌握。 1、读取原图 const char filename[] = "/Users/linwang/Desktop/Lena.png"; Mat Im = imread(filename); cout; cout<<"Im.rows =
  • Mat Img = imread(filename); cout三维图像的维度:"; cout三维图像的通道数:"(); cout三维图像的宽:"; cout三维图像的高:"; cout数据类型的大小 "(); cout存放一个列元素的大小:"(); cout[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_
  • OpenCv像素获取与修改

    千次阅读 2017-06-22 11:27:32
    1、matlab获取彩色图像像素值的方法 img=imread('test.jpg'); img1=img(:,:,1); img2=img(:,:,2);...2、opencv获取图像像素的方法 方法一: IplImage *img = cvLoadImage("Lena.jpg", 0); CvScal
  • OpenCV Mat访问指定像素

    千次阅读 2017-08-20 17:09:11
    转自:http://blog.sina.com.cn/s/blog_dc3c53e90101f3mx.html如果是采用Mat形式存储,想要访问灰度图像的灰度值,可以采用如下方法:int grayValue = image.at(i, j);如果是彩色图像,采用如下方法:int colorValue...
  • 首先,在Opencv2中基本上都是用的Mat来表示图像了,C++的函数调用中基本上也都是Mat图,从根本上说,一张图像是一个由数值组成的矩阵,矩阵的每一个元素代表一个像素。对于灰度图像而言,像素有8位无符号数表示,...
  • Mat对象像素操作 像素的算术与逻辑运算 像素读写 Mat像素读写get与put方法支持一下几种图像类型 方法 支持类型 double[] get(int row,int col) 以下全部 int [] get(int row,int col,double[] data) CV...
  • Opencv 访问Mat像素的值的快速方法

    千次阅读 2014-12-18 18:18:10
    结论是: Mat.at(i,j)的方法是很慢的,最好不要用这种方法来。而涉及到指针的方法效果往往比较好!( O(∩_∩)O哈哈~这个不是作者说的哈,我说的) 在《OpenCV 2 Computer Vision Application Programming ...
  • OpenCvSharp 得到Mat像素点的值

    千次阅读 2018-04-07 17:30:11
    image是Mat类型,得到第5行,第100列的像素值。注意返回值的类型是Vec3bVec3b value = image.Get&lt;Vec3b&gt;(5, 100);与At的功能相似,但是当返回灰度图的值时,At返回的三个值是相等的,Get返回的三个值...
  • 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 =...
  • 环境配置   VS2013+OpenCV3.0+Win7(X64)    前言 ...所以我们需要了解一下OpenCV如何访问图像中的像素点。首先说明一下,这里默认图像储存为Mat格式,RGB类型。    三种访问方式 ...
  • 参考:【OpenCV】访问Mat中每个像素的值(新) 膜拜大佬 以下例子代码均针对8位单通道灰度图。 1 .ptr和[]操作符 Mat最直接的访问方法是通过.ptr<>函数得到一行的指针,并用[]操作符访问某一列的像素值...
  • OpenCV(三) Mat像素操作

    千次阅读 2019-03-27 17:11:51
    获取图像数据的时候,知道Mat的类型与通道数目至关重要,根据Mat的类型与通道数目,开辟适当大小的内存空间,然后通过get方法就可以循环实现每个像素点值的读取、修改,然后再通过put方法修改与Mat对应的数据部分...
  • 本文实现功能:利用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 Mat类与像素值处理,图片读取

    千次阅读 2019-11-03 20:05:22
    Mat类与scalar //创建一个矩阵 Mat A(3,3,CV_8UC1,Scalar::all(77)); cout<<A; 这里的含义是建立一个row=3,col=3的矩阵A,矩阵中的...这样可以构建出一个通道的数值,并赋值给各个像素。 为什么这里要使用a...
  • Mat像素获取与赋值

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

    千次阅读 2019-03-13 20:08:12
    其实也就是将图片的RGB信息放进pixel里面,获取像素点的RGB值 PS :1. &0xff 为了保证二进制数据的一致性(在上一篇博文已经提过  点此查看 )  2. ((255&0xff) ) | ((r&0xff) ) | ((g&0xff) ) | (r&0xff)...
  • Mat像素处理 从Mat中读取像素数据 读取一个像素数据,这种方式就是和bitmap中的读取一个像素点的方式是一样的,将每个像素点进行处理。 Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R....
  • 1: 输出一个Mat对象的像素 自定义一个Mat 对象,然后输出像素值(像素值基本都在 0 – 255 之间 ,图像为三通道) 代码 public static void F1() { Scalar s = new Scalar(0, 0, 255); //定义一个三通道颜色...
  • 我最开始学习OpenCV的时候,网上搜索,获取某个像素点的值,大概是这样的, srcImg.at(i, j) 当然这样可以获取,但是效率很低,也就是速度很慢,然后网上搜索了第二个方法,大概是这样的 int MainWindow::brightTest...
  • 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...
  • Mat矩阵中每一个元素代表一个像素,灰度图像,像素用8U 无符号数,0黑色,255白色;彩色图像,每个像素需要3位这样的8U表示,即三个通道(R、G、B),矩阵依次存储一个像素的三个通道值,然后再存储下一个像素点。 ...
  • 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>...
  • opencv3::Mat元素的获取、at、ptr

    千次阅读 2018-06-24 12:02:31
    http://lib.csdn.net/article/opencv/28700?knId=1218 https://blog.csdn.net/xiaowei_cqu/article/details/19839019 https://blog.csdn.net/u011574296/article/details/70139563 int main(int argc, char...
  • Mat 像素获取

    2017-11-12 19:48:22
    VS2013+Opencv2.4.9 获取图像的像素值。像素的赋值、遍历像素

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,001
精华内容 4,000
关键字:

matopencv像素获取