OpenCV学习 1 图像的缩小、灰度化及边缘检测
一、学习历程
本文为小僧第一篇博文可能内容较为简洁(当然以后也会这么简洁,深奥的小僧也不懂_),只是做一个初步的尝试,为以后写文章做准备。同时也希望能和同道中人多加交流,彼此学习,共同进步。
本文讲述刚开始学习OpenCV时的一些基础操作及代码演示,同时对代码做一定的讲解和其中一些小疑点。在小僧刚开始学习OpenCV时四处碰壁,简直上天入地,额,简直叫天天不应叫地地不灵。(其实现在也是(╥﹏╥))那好吧自己选的坑,跪着也要填完。互吹完毕,下面开始。
二、本篇内容
(1)我们都知道在OpenCV中有个头文件#include<opencv2\opencv.hpp>非常好用,几乎只要这个就没其他头文件什么事了。其实对于刚开始学习的时候是这样,因为这样确实节省了敲代码的时间。然而随着学习的深入也逐渐发现了一些端倪,如果使用这个统一的头文件在很多时候会拖累编译的速度,若使用#include<opencv2\highgui.hpp>;或其他直属头文件则会大大加快编译速度。因此有利也有弊,如何取舍,见仁见智。
(2)OpenCV的函数都在cv的命名空间下,如果想要调用OpenCV函数需要在每一个函数前面加cv::向编译器说明才行,但这样过于麻烦,为了避免这种傻瓜式的设计我们可以在函数前加上using namespace cv;就直接告诉编译器接下去的函数都是在cv命名空间下的。
(3)namedWindow();这玩意儿一开始直接被小僧忽略了,因为在OpenCV中imread可以自动形成窗口,当时觉得占了大便宜开心的八达鸟,所以在后面的操作中吃了大亏,其实这函数对于刚开始学的人来说比如只要求简单的显示图像确实是可以忽略的。但是在后来的操作中需要在图像上加滑动条或者多张图像的混合处理时这个函数就发挥了极大的作用,他就像一道光一样照亮了前方的路。
接着我们说说这个函数的一些小问题,比如下面的代码namedWindow(“图”,WINDOW_AUTOSIZE);imshow(“图1”,tu);在这两句中如果引号中的字不一样(一个是“图”,一个是“图1”)会发生什么。(看图说话)
如果是正常的就跟下图一样
如果哪天你发现突然多了一个莫名其妙的窗口那应该就是这个问题。所以我们必须要保证引号中的字符要一毛一样,多个空格都不行。
另外该函数的第二个参数一般用两种形式表示WINDOW_AUTOSIZE或者WINDOW_NORMAL;对于前者WINDOW_AUTOSIZE是不能手动拉伸的计算机给你多大的窗你就有多大的疮。这也有可能产生一些小问题比如下图:可以看出灰度图太大图像不能完全显示,且不能手动修改
那么这时候可以用WINDOW_NORMAL;可以手动拉伸其大小,想多小就多小。
三、小结
好吧,时间原因今天暂时交流这么多(其实还有时间只是想去打球了)
接下去要说的也比较简单,代码中有解释,聪明如柳无须解释。
//代码借鉴《学习OpenCV3 》
#include<opencv2\opencv.hpp>
using namespace cv;
int main(){
Mat tu1,tu2,tu3,tu4;
namedWindow("图1",WINDOW_AUTOSIZE);
namedWindow("图2",WINDOW_AUTOSIZE);
namedWindow("图3",WINDOW_AUTOSIZE);
namedWindow("图4",WINDOW_NORMAL);
//原图显示
tu1=imread("猪2.jpg");
imshow("图1",tu1);
//将原图的长宽缩小一半
pyrDown(tu1,tu2); //pyrDown是将原图的长和宽变为原来的一半;
imshow("图2",tu2);
//彩色图转灰度图
cvtColor(tu2,tu3,COLOR_BGR2GRAY);
imshow("图3",tu3);
//边缘检测
Canny( tu3,tu4,10,100,3,true);
imshow("图4",tu4);
waitKey(0);
return 0;
}
北京时间21:21 乒乓时间到