因为之前参加恩智浦的比赛所以没有时间写第二讲,今天抽出了时间写写第二讲,图片的读取及图片灰度化,下一讲会讲比赛用的最广的单目标识别。
图片的读取
- ** 在Opencv中有自己的图片读取函数imread(英文:image read),自动将JPG图片读入,输出为Mat形式 注意这里的Mat和数组是有很大区别的,有兴趣的可百度**
- ** 所以调用图片之前我们需要先建立一个空Mat来承载图片,然后用imread()函数读取图片。**
imread()函数的说明
** 在OpenCv中的定义为:`
Mat imread( const String& filename, int flags = IMREAD_COLOR );
所以其中有两个输入,1是图片路径,2是图片格式(一般默认即可)
图片的读取程序
程序如图,其中image就是读取的Mat数据,imshow为显示读取的图片
Mat image;
image = imread("C:/图像处理/Opencv/frame/123.jpg");
imshow("原图", image); //第一个输入为图窗标题,第二个输入为要显示的图片
图片效果
我们找一个图片输入看看实际效果
成功显示了图窗标题,并且显示了要读取的图片。
Mat image的数据格式
我们成功显示了原图,接下来让我们直观的看看image承载的图片数据是怎么样的。因为矩阵数据过大,所以我截取了一部分
** 我们可以看出图窗在重复刷新3列数据,这就是说明我们读取的是RGB格式图片,三列数据分别为图像元素点的R,G,B值。在正式图形处理中,这样的图片数据过大,普通主控如STM32,K60,无法快速处理,而我们又无需这样详细的数据,所以随之产生了大量的图像算法。接下来我讲最基础的图形格式转换,灰度转换**
图片的灰度化
转格式函数说明
** Opencv有自己的图片转格式程序cvtColor()**
程序定义为:
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
有四个输入。我们一般只需要前三个即可。
第一个为输入的图片,
第二个为输出图片,
第三个即为颜色映射码,通俗讲就是图片转换方式(可填名称,也可填code值),在OpenCv中有大量的格式转换方式。
如图:
我们要做RGB图片转灰度,即可使用第7个,RGB2GRAY(英文解释:RGB to GRAY)
第四个参数,dstCn用于指定目标图像的通道数,如果指定的值是默认值0,那么通道数将由输入图像和颜色转换码决定,即无特殊要求,可不填。
图片的灰度化程序
cvtColor(image, imgGray, CV_RGB2GRAY); //这里的CV_RGB2GRAY可替换为7
程序中的image即为读取的原图(RGB格式);
imgGray即为转换之后的灰度图(单通道灰度形式 UNIT8);
CV_RGB2GRAY 为转换命令RGB to GRAY。
图片效果
先将程序贴出来:
Mat image, imgGray;
image = imread("C:/Users/12725/Desktop/CSDN/视屏处理/第二讲/图片文件/F.jpg");
if (!image.data)
{
cout << "Please input image path" << endl;
return 0;
}
imshow("原图", image);
cvtColor(image, imgGray, CV_RGB2GRAY);//灰度化处理
imshow("灰度图", imgGray);
我们将原图和灰度图一起显示,并做对比:
明显看出图片变得不再鲜艳,灰度化之后的图片整体呈现黑白话,这就说明我们灰度转换成功了。
图片格式
我们将图片中的一部分数据打印出来看一下格式:
我们对比RGB的矩阵数据,明显发现这个图片的矩阵数据各列都不相同,每个值都代表图片中一个元素点的灰度值,并且各灰度值都是unit8格式的(0~255),灰度化成功。
贴出本文所用的所有程序
int main()
{
Mat image, imgGray;
image = imread("C:/Users/12725/Desktop/CSDN/视屏处理/第二讲/图片文件/F.jpg");
if (!image.data)
{
cout << "Please input image path" << endl;
return 0;
}
imshow("原图", image);
//cout << image << endl;//打印读取的原图数据格式(建议注释)
cvtColor(image, imgGray, CV_RGB2GRAY);
imshow("灰度图", imgGray);
//cout << imgGray << endl;//打印读取的原图数据格式(建议注释)
}
```