干货 | 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)


干货 | Opencv入门

(效果图)


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入门

(原图)


(效果图)


上面程序展示了图像载入显示输出和滑动条创建函数,同时运用了颜色空间转换和阈值化函数,算是小小展示了下opencv处理图像的强大功能。

But...!

仅仅会这点知识是不够的,想要弄好校内赛,还需要小伙伴自学更多opencv的模块,同时不断增强编写C++等编程语言的能力,也推荐大家参考《opencv3编程入门》这本书, 同时多看CSDN上一些大神们的博客。


最后,祝大家校内赛取得圆满成绩!

今天是愚人节,

可别被整蛊了哟~

愚人节快乐!


                                                              文案 | 张灿炜

                                                                                    排版 | 张灿炜

以上是关于干货 | Opencv入门的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV | OpenCV实战从入门到精通系列四 --常用函数讲解

OpenCV | OpenCV实战从入门到精通系列三 --canny边缘检测

OpenCV | OpenCV实战从入门到精通系列三 --canny边缘检测

OpenCV | OpenCV实战从入门到精通系列二 -- OpenCV图像腐蚀

OpenCV | OpenCV实战从入门到精通系列二 -- OpenCV图像腐蚀

OpenCV | OpenCV实战从入门到精通系列二 -- OpenCV图像腐蚀