上一节我们成功安装了OpenCV,使用Win的同学可以参考别的前辈的文章,特别注意的使用VS配置OpenCV的时候经常会出现很多错误,试着把提示的错误的所有信息去百度一下。在Win上使用CV我只用过一次,着实也是费了一番功夫。这一节先说说头文件动态库对应的功能,然后给出几个看起来有意思的小例子。OpenCV的学习和C++那种基础语言的学习不一样,这是一种实用的工具,所以本着在实践中去检验真理的原则,以后更多的会用例子的形式去说。希望各位看官能够自己把代码敲进去不要复制粘贴,机器环境千差万别,调整检验的过程也是很重要的学习的过程。
之前说到使用OpenCV ,就是使用头文件+动态库的形式。我们先了解一下这些头文件对应的大体是什么功能或者说是模块。/usr/local/Cellar/opencv/3.4.1_5/include/opencv 和 /usr/local/Cellar/opencv/3.4.1_5/include/opencv2
opencv有 cv.h cv.hpp cvaux.h cvaux.hpp cvwimage.h cxcore.h cxcore.hpp cxeigen.hpp cxmisc.h highgui.h ml.h;这些头文件以.h结尾的是C形式的头文件,.hpp是C++形式的头文件。这里的头文件是属于OpenCV1.0大致有的最基础的头文件了,也就是核心。
opencv2里有很多头文件和文件夹,简述几个常用的有用
core 核心模块 里面有CV基本的数据结构 绘图的函数 辅助的一些函数和宏 都说了是core了肯定是核心啦
highgui 这里面事涉及到GUI方面了 就是图形界面 有一些基础的函数和接口
imgproc 这里面是图像处理模块包含如 线性非线性变化 直方图 图形几何变化 和特征检测什么的
photo 图像去噪和修复
stitching 图像拼接
video 视频处理组件
ml 机器学习模块
objdetect 目标检测模块
features2d 2d功能模块
calib3d 有关相机和3D 模块
下面给几个快速入门的好玩的例子
1.图像腐蚀
额 看起来很厉害 貌似是用阴暗的点去替换掉高亮的点 图像形态学的原理得以后再说 我只是看起来挺厉害的 拿出来玩玩
代码:
#include <iostream>
#include <opencv.hpp>
#include <highgui.hpp>
#include <opencv.hpp>
#include <imgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc, const char * argv[]) {
// insert code here...
Mat Imags = imread("/Users/apple1/Desktop/兔子.PNG");//读取图片
imshow("source", Imags);//显示图片在 名为"source"的窗口里
Mat element = getStructuringElement(MORPH_RECT, Size(15,15));//获得用来腐蚀的内核矩阵
Mat Imags2;//用来存放腐蚀之后的图片
erode(Imags,Imags2,element);//进行腐蚀操作
imshow("target", Imags2);//显示图片 在名为"target"的窗口里
cvWaitKey(0);//等待按键操作再执行后续 按随意键将进行下一步 return 程序结束
return 0;
}
效果 :
感觉这只兔子一下子变老了很多 显然 黑色线条变粗了 黑线条周围的点都被黑色替换了。
2.图像模糊
下一个例子是图像模糊 利用的是均值滤波 还是 看看效果先 具体啥原理以后再说 算法书还没到 先看看热闹
#include <iostream>
#include <opencv.hpp>
#include <highgui.hpp>
#include <opencv.hpp>
#include <imgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc, const char * argv[]) {
// insert code here...
Mat Imags = imread("/Users/apple1/Desktop/兔子.PNG");//读取图片
imshow("source", Imags);//显示图片在 名为"source"的窗口里
Mat Imags2;//用来存放模糊之后的图片
blur(Imags, Imags2, Size(20,20));//进行均值滤波 字面上感觉应该是在20*20的像素内 取平均值 然后低于的或者高于的被替换掉
imshow("target", Imags2);//显示图片 在名为"target"的窗口里
cvWaitKey(0);//等待按键操作再执行后续 按随意键将进行下一步 return 程序结束
return 0;
}
怕不是我的近视程度又加深了 很明显看到图像模糊了
3.边缘检测
吊炸天的来了
#include <iostream>
#include <opencv.hpp>
#include <highgui.hpp>
#include <opencv.hpp>
#include <imgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc, const char * argv[]) {
// insert code here...
Mat Imags = imread("/Users/apple1/Desktop/兔子.PNG");//读取图片
imshow("source", Imags);//显示图片在 名为"source"的窗口里
Mat edge ,grayImage;//应该是一个是边缘 一个是灰度图 别问我为啥 我猜的
cvtColor(Imags, grayImage, CV_BGR2GRAY);//图片的二值画 五颜六色变成非黑即白呗
blur(grayImage, edge, Size(3,3));//这里据说是降噪
Canny(edge,edge,3,9,3);//用Canny算子 本科的时候听过一点图像处理的课 貌似是用一个矩阵处理一下图片
imshow("target", edge);//显示图片 在名为"target"的窗口里
cvWaitKey(0);//等待按键操作再执行后续 按随意键将进行下一步 return 程序结束
return 0;
}
一只黑白的兔子 嘿嘿 仔细观察会发现 原来的边缘 都被一层线包上了 达到了边缘检测的效果 可能是图片边缘少 效果不明显
今天辛苦这只兔子了 下次我还是多找找别的图片吧 。综上 我们了解了基本的头文件的类型。在以后的项目过程中 选择适当的文件 当然你要是都扩进去也挺好的。然后用眼睛看到了一些基本的图像处理的操作,说真的,第一次看的时候挺惊艳的。所以,就此误入此路一生吧。下一节开始,就要真的进行真格的学习了。我买了两种书 三本 这本《OpenCV3编程入门》是讲CV技术的。今天快递只到了这一本。另外试讲基础算法的。我尽量试试融合到一起看看。水了一节 不过玩的过程还是挺开心的。诸君晚安。