opencv内存总结和访问图像中像素方法案例(指针方法)

来源:互联网 发布:淘宝细节图尺寸 编辑:程序博客网 时间:2024/05/29 19:06

1.Mat是一个类,有两个数据部分组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同,矩阵可以是不同的维数)的指针。

2.Opencv函数中输出图像和内存分配是自动完成的(不特别指明)

3.不考虑内存释放问题

4.赋值运算符合拷贝构造函数值复制信息头

5.Opencv引用计数机制,让每个Mat对象有自己的信息头,但共享一个矩阵,让矩阵指针指向同一个地址而实现。

6.RGB是常见的一种颜色空间,与人眼采用相似的工作机制

7.HSVHLS吧颜色分解成色调、饱和度和亮度、明度。使算法对输入图像的光照条件不敏感。



//访问图像中像素方法
#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace std;
using namespace cv;
//全局函数声明
void colorReduce(Mat& inputImage,Mat& outputImage,int div);
//控制台应用程序的入口函数
int main(){
//创建原始图并显示
Mat srcImage = imread("1.jpg");
imshow("1",srcImage);
Mat dstImage;
dstImage.create(srcImage.rows,srcImage.cols,srcImage.type());
//记录起始时间  计时函数
double time0 = static_cast<double>(getTickCount());
//调用颜色空间缩减函数
colorReduce(srcImage,dstImage,32);
//计算运行时间并输出
time0 = ((double)getTickCount()- time0)/getTickFrequency();
cout<<"this method's running time is"<<time0<<"s"<<endl;
//显示效果图
imshow("2",dstImage);
waitKey(0);
}
void colorReduce(Mat& inputImage,Mat& outputImage,int div){
outputImage = inputImage.clone();
int rowNumber = outputImage.rows;
int colNumber = outputImage.cols*outputImage.channels();
for (int i = 0;i<rowNumber;i++)
{
uchar* data = outputImage.ptr<uchar>(i);
for(int j = 0;j<colNumber;j++)
{
data[j]=data[j]/div*div+div/2;
}
}
}

1 0
原创粉丝点击