OpenCV4.0学习笔记(3)Mat对象
Mat是opencv2.0时引进的,但是目前的知识水平没有办法好好的理解Mat的作用,根据查询所得到的结果作用是为了对定义的对象进行封装以减少过多的繁琐定义过程。
在个人理解下就是一个好用的万金油定义格式,可能理解会随着日后的理解和学习逐渐改变。
编写opencv文件的一般格式
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc, char**argv)
{
src,dst;
src = imread("E://text//text.jpg");
if (src1.empty())
{
printf("can't show the image1...");
return -1;
}
show("the first image", src);
waitKey(0);
return 0;
}
以上代码相当于一个测试的代码,即先定义头文件,然后定义函数和变量,读取图像,检测能否读取,显示图像。
而对于图像的处理过程都可以加在其中。
为了理解方便,一般将原图片命名为src,处理后的图片定义为dst。
一般都在定义主函数后就使用Mat定义src和dst。
复制图像
复制图像我一般使用三个函数,一个是直接使用克隆函数,另一个是定义一个和原图同size同type的图像,还有一个是使用copyTo函数
*************************************************
Mat dst;
dst = Mat(scr.size(), scr.type());
*************************************************
Mat dst = scr.clone();
*************************************************
Mat dst;
src.copyTo(dst);
*************************************************
产生的图像都是和src一样的图像
通道channels
在这里暂时先提出一些理论知识,但是主要的内容会在下一章博客介绍,即彩色图片是由多通道组成的,最常见的rgb彩色图片,其中r-red,g-green,b-blue,通过三层不同的像素值叠加形成彩色。而灰色图像只有一层,人脸定位一般就是转化为灰度图像然后二值化最后找到最大连通区域最后完成人脸的定位。
而在opencv中是可以直接输出图像的通道数的:
printf("input image channels:%d\n", src.channels());
printf("output image channels:%d\n", dst.channels());
上述代码是输出src,dst图像的通道数
但是在输出函数的row数和column数时需要先用int进行整型定义,最后进行输出:
int cols = dst.cols;
int rows = dst.rows;
printf("rows:%d cols:%d\n", rows, cols);
最后补充下上一章笔记中所说的腌膜内容
腌膜内容是可以用Mat进行定义的,定义了腌膜的内容后直接使用filter2D函数即可对图像进行处理
Mat csrc;
Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(src, csrc, -1, kernel);
定义了一个腌膜和src腌膜处理的图像csrc
创建一个RGB三通道的图片
这个在我理解中应该是重点了
方法主要也有两种,以一种是利用CV_8UC3,Scalar函数创建一个自己定义大小和颜色的图片:
Mat M = (100,100,CV_8UC3,Scalar(0,0,255));
上述代码是创建了一个大小为100*100像素的图片(0,0,255)分别表示b,g,r,三层通道像素的大小,值越小亮度越低,值越大亮度越高,即表示一个纯红色的100 *100像素大小的图片。
另一种是只用create函数创造一个跟之前已经定义了的图像相同大小的图片:
Mat m.creat(src.size(),src.type());
m = Scalar(0,0,255)
上述代码是创建了一个跟src图像一样大小的纯红色图片
ps:补充内容使用zeros函数可以生成一个跟原图大小一致但是像素值为255的图像
Mat m2 = Mat::zeros(src.size(),src.type);
本次联系所使用的代码
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int arhe, char**argv)
{
Mat src;
src = imread("E://text//text.jpg");
if (src.empty())
{
printf("can't show the image...");
return -1;
}
imshow("imput", src);
/*
Mat dst;
dst = Mat(scr.size(), scr.type());
imshow("output", dst);
*/
//Mat dst = scr.clone();
/*Mat dst;,
src.copyTo(dst);
imshow("output", dst);
*/
Mat dst;
cvtColor(src, dst,COLOR_BGR2GRAY);
printf("input image channels:%d\n", src.channels());
printf("output image channels:%d\n", dst.channels());
int cols = dst.cols;
int rows = dst.rows;
printf("rows:%d cols:%d\n", rows, cols);
const uchar*firstRow = dst.ptr<uchar>(0);
printf("first pixel value:%d\n", *firstRow);
//Mat M(100, 100, CV_8UC3,Scalar(0,0,255));
//cout << "M =" << end l<< M << endl;
Mat m1;
m1.create(src.size(), src.type());
m1 = Scalar(0, 0, 225);
imshow("uotput", m1);
//imshow("output", M);
Mat csrc;
Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
filter2D(src, csrc, -1, kernel);
Mat m2 = Mat:: zeros(src.size(), src.type());
imshow("output", m2);
waitKey(0);
return 0;
}