干货 | Opencv入门
Posted scutrobot
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了干货 | Opencv入门相关的知识,希望对你有一定的参考价值。
Opencv...? 好熟的名字?
好像在哪见过?
嘿嘿..不知道小伙伴们有没有看前几期的推文
作为攻破校内赛神符的利器,小伙伴可要好好重视~
今天小编就简要介绍Opencv的几个基础函数,带大家玩玩Opencv!
(可能需要大家会一点C++)
1. Mat类
Mat类的全名叫做基础图像容器,是opencv2对于opencv1中图像处理结构体IplImage的重大改进,避免了使用Iplimage*结构使用后要手动释放内存的麻烦,使我们能花更多精力在程序功能的设计上。
Mat类本身存储的是图像像素为元的矩阵,所以一般结合imread()函数使用,不过有时候也可以直接用Mat类构建一个矩阵。
2. Imread()函数
Imread函数是图像载入函数,先来看它的原型。
Mat imread(const string& filename, int flags=1)
第一个参数string类的引用,使用时要填入载入的图像的绝对路径(如果图像在工程目录下,可以直接填写图像名,不过还是绝对路径最稳妥),第二个参数是载入图像的颜色类型,opencv中对于颜色格式的标识用了一个枚举体来取值,所以1就代表彩色图像即三通道图,0代表灰度图,负数是返回包含Alpha通道的加载图像,如果不填就取默认值1。
具体使用:读入一个三通道图: Mat image0=imread(“绝对路径”)
这样就将一个具体图像的像素矩阵赋值给了一个Mat类对象。
3. Imshow()函数
Imshow()是图像显示函数,函数原型如下:
Void imshow(const string& winname,InputArray mat)
第一个参数是显示图像的窗口名称,可以填入任一个名称,第二个参数InputArray类型可以简单等同于Mat 类,即要填入存储着你想要显示的图像的Mat类对象。
具体使用:(打开上面的image0对象) imshow(”窗口名称”, image0)
(效果图)
4. imwrite()函数
imwrite函数可以将图像输入到文件,函数原型:
bool imwrite(const string& filename,InputArray img,const vector<int>& params=vector<int>())
第一个参数填要写入的文件名或路径(要带后缀,如.jpg),第二个参数填一个Mat类对象即可,第三个参数是特定格式保存编码,具体参数小伙伴们可以百度。
具体使用:imwrite(”文件名”,image0)
5. VideoCapture类
VideoCapture是一个负责载入视频的类,通过VIdeoCapture读入视频,再把每一帧赋值给Mat类,就可以播放视频了。
具体使用:
VideoCapture capture(”文件名”);
Mat image;
while(1)
{
capture>>image;
imshow(“窗口名”,image);
waitKey(30);
}
上面的三个函数是Opencv里面最基础的部分,可能有小伙伴们会疑惑为什么要把函数原型给打出来,只要用法说明了不就好了吗,然而小编认为认识函数原型一可以避免输入不符合要求的参数,二是可以加深对这个函数的理解,不过这就需要小伙伴们有一定的C++基础,其实如果选择用C++来作为Opencv的编程语言,而且想用好Opencv,上面所涉及到的知识已经是很低的要求了,小伙伴们加油吧!
滑动条是图像处理过程中一个十分有用的工具,可以方便我们适当
调节函数参数。 而创建滑动条要用到createTrackbar()函数
createTrackbar函数原型:
int createTrackbar(conststring& trackbarname, conststring& winname,
int* value, int count, TrackbarCallback onChange=0, void* userdate=0)
第一个参数是滑动条的名字,第二个参数是滑动条要附着的窗口的名 字,第三个参数是滑块的初始位置,第四个参数是滑动条的最大值,第五个参数是一个指向回调函数的指针,第六个参数是用户传给回调函数的数据,用来处理轨迹条滑块改变带来的影响,如果第三个参数是全局变量,可以不管这个参数。
那么什么是回调函数呢?回调函数基础定义是一个通过函数指针调用的函数,通常是一些图像处理函数,通过将滑动条滑块位置改变带来的数值改变传给该函数进行处理。
回调函数函数原型必须用 void xxx(int,void*)
下面就综合以上几个函数,写一个小程序给大家示范。
#include<opencv2/opencv.hpp> /*包含了opencv几乎所有的头文件*/
#include<iostream>
using namespace std;
using namespace cv;
int picture_value = 100;/*回调函数第三个函数,即滑块的初始值*/
int picture_tpye = 0;
Mat N_picture, G_picture, D_picture;
void on_Threshold(int, void*);
int main()
{
Mat N_picture = imread("F://data//kuli.jpg");
if (N_picture.data)
{
imshow("原图", N_picture);
cvtColor(N_picture, G_picture, COLOR_BGR2GRAY);/*将彩色图转成 灰度图*/
namedWindow("kuli1", WINDOW_AUTOSIZE);//创建窗口
createTrackbar("模式", "kuli1", &picture_tpye, 4, on_Threshold);
createTrackbar("参数值", "kuli1", &picture_value, 255, on_Threshold);
on_Threshold(0, 0);//回调函数初始化
imwrite("F://data//kuli1.jpg", D_picture);/*将处理过的图片输出到指定文件夹*/
while (1)//检测函数,当用户按下c是退出
{
int key;
key = waitKey(20);
if ((char)key == 'c')
{
break;
}
}
return 0;
}
else
{
cout << "未能正常读取图片";
return -1;
}
}
void on_Threshold(int, void*)//回调函数定义
{
threshold(G_picture, D_picture, picture_value, 255, picture_tpye);//阈值化函数
imshow("kuli1", D_picture);
imwrite(
}
(原图)
(效果图)
上面程序展示了图像载入显示输出和滑动条创建函数,同时运用了颜色空间转换和阈值化函数,算是小小展示了下opencv处理图像的强大功能。
But...!
仅仅会这点知识是不够的,想要弄好校内赛,还需要小伙伴自学更多opencv的模块,同时不断增强编写C++等编程语言的能力,也推荐大家参考《opencv3编程入门》这本书, 同时多看CSDN上一些大神们的博客。
最后,祝大家校内赛取得圆满成绩!
今天是愚人节,
可别被整蛊了哟~
愚人节快乐!
文案 | 张灿炜
排版 | 张灿炜
以上是关于干货 | Opencv入门的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV | OpenCV实战从入门到精通系列四 --常用函数讲解
OpenCV | OpenCV实战从入门到精通系列三 --canny边缘检测
OpenCV | OpenCV实战从入门到精通系列三 --canny边缘检测
OpenCV | OpenCV实战从入门到精通系列二 -- OpenCV图像腐蚀