open cvMat的使用
Mat对象 自动分配内存 不会泄露数据 分 头部和数据部
ipllmage早期对象 需要自行分配与管理内存 导致内存泄漏
Mat对象构造函数与常用方法
常用方法:
**Mat()
Mat (int rows, int cols, int type)
Mat(ize size, in type)
Mat (int rows, int cols, int type, const Scalar 8S)
Mat (Size size, int type, const Scalar &S)
Mat (int ndims, const int ies, int type)
Mat (int ndims, const int sizes, int type, const Scalar &S)
常用方法
**
void copyTo(Mat mat) 完全复制一份
void convertTo(Mat dst, int type) 数据类型转换
Mat clone()完全复制一份
int chanels() 通道
int depth) 深度
bool empty(); 是否为空
uchar* ptr[i=0) 可不可以获取这个i(行)的指针**
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>//iostream没有后缀
#include <math.h>
using namespace cv;
using namespace std;
int main()
{
Mat src;
src = imread("D:/实验台/机器视觉/测试图片/机器人正面.jpg");
if (src.empty())//如果src这个数据库属性为空
{
cout << "无法打开" << endl;
return -1;
}
namedWindow("原图", CV_WINDOW_AUTOSIZE);
//namedwindow函数与imshow函数同名时 namedwindow函数不起作用
imshow("原图", src);
/*
Mat dst;
dst=Mat(src.size(), src.type());
//定义dst数据库与src数据库的大小和类型一致
dst = Scalar(75,255, 255);
//将图像设置成单一灰度和颜色*3通道
*/
//Mat dst = src.clone();
//克隆一个和src完全一样的数据库
Mat dst;
//src.copyTo(dst);
//clone是共享了与src的数据库 copyto是新建了数据库空间 clone的底层是copyto
cvtColor(src, dst, CV_BGR2GRAY);
//颜色空间转换函数
printf("src通道数%d\n", src.channels());
printf("dst通道数%d\n", dst.channels());
// 输出图像的通道数,我们一般看到的彩色图片为3通道的RGB图像
// 灰度图为单通道图像
const uchar* firstRow = dst.ptr<uchar>(0);
//获取dst第一行的行首指针,若获取其它行首指针,
//将圆括号中的0改为目标行
//获取第一行第一个元素的值,若获取第一行
//第i个像素值,可以用firstRow[i]
printf("第一像素值: %d\n", *firstRow);
double t = getTickCount();
printf("dst行数%d\n", dst.cols);//获取dst数据库的像素宽度 行数
printf("dst列数%d\n", dst.rows);//获取dst数据库的像素高度 列数
Mat M(3, 3, CV_8UC3, Scalar(0,0,255));
imshow("自建图像", M);
//构造一张3*3,像素值为(0,0,255)的图像M
//CV_8UC3,8指8位,UC指u char类型,3指3通道
//第四个参数表示初始化每个像素的多少 长度和通道数应一致
Mat M1;
M1.create(src.size(), src.type());
M1 = Scalar(0, 0, 255);//创建一个单一色彩图像
imshow("create创建图像", M1);//红色
Mat dst2;
Mat kernel = (Mat_<char>(3,3)<< 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(src, dst2, -1, kernel);
imshow("掩膜后的原图", dst2);
Mat zeros = Mat::zeros(src.size(), src.type());
//Mat m2(128, 128, CV_8UC3,Scalar(25,25,115));
//Mat m2 = Mat::eye(128, 128, CV_8UC1);
imshow("纯黑处理的原图", zeros);
//定义一个3x3的像素数列集合
//3个通道
cout << "M=" << endl << M << endl;
namedWindow("复制后", CV_WINDOW_AUTOSIZE);
imshow("复制后", dst);
double time = (cvGetTickCount() - t) / getTickFrequency();
printf("%.2fS\n",time);
waitKey(0);
return 0;
}
Mat对象使用
部分复制:一般情况下只会复制Mat对象的头和指针部分,不会复制数据部分
Mat A= imread(图片地址);
Mat B(A) 只复制
完全复制:如果想把Mat对象的头部和数据部分一起
复制,可以通过如下两个API实现
Mat A = B.clone();或Mat A; A.copyTo(B);
Mat对象使用-四个要点
1.输出图像的内存是自动分配的
2.使用QpenGV的C+接口,不需要考虑内存分配问题
3.赋值操作和拷贝构造函数只会复制头部分
4.使用clone与copyTo两个函数实现数据完全复制
dst = Scalar(75,255, 255);将图像设置成单一灰度和颜色