暑假开始了,这次申请了留校,所以将有大把时间。初步打算如下:补完java和c++知识,Opencv入门,复习提高算法,加深Python知识,可谓是任务繁重。加油。闲言少叙,今天是OpenCV初步入门。

准备工作

  • 下载

    使用OpenCV3和VS2017

  • 设置环境变量

    注意,新版本的build文件夹中不存在网上部分教程里的x86和x64文件夹,只有一个x64,选择里面VC的版本视vs的情况而定,2017应选择vc15。

  • 工程包含(include)目录的配置:

    可以在解决方案资源管理器项目标题处右击或者vs视图->其它窗口->属性管理器打开属性相关设置,没有区别。注意不要学网上有的教程那样对于release,debug和win32,x64单独设置(前文说了,新版本只有一个x64的文件夹)。正确的做法是在解决方案资源管理器空白处右击设置整个项目的属性或者在下图中的项目名位置处右击,设置属性。设置包括包含目录,库目录,链接器三部分。注意,链接器在新版本中只需添加两个了(被浓缩了),位于库目录之内,有d的是debug的,没有的是release的,两个都要加,debug在前,即优先支持debug。

    Update:经测试,上述方法会有几率引发错误。稳妥的办法是在属性管理器中针对release和debug的x64版本分别设置属性(不带带d和带d)。

    属性设置

Tips:项目属性页设置必须是选择x64,因为目前压根就没有x86的相关文件存在,不要设置错了。运行时也要选择x64。后文将会使用CMake编译处x86文件。

 下面是测试代码:

1
2
3
4
5
6
7
8
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("迷路帖.png");//Mat为图像存储数据结构类
imshow("载入的图片", img);
waitKey(0);
}

 下面的代码进行了“腐蚀”操作,用图片的暗色部分替换掉高亮部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
Mat srcImage = imread("1.jpg");
imshow("原图", srcImage);
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));//该函数的返回值为指定形状和尺寸的结构元素
Mat dstImage;
erode(srcImage, dstImage, element);//进行腐蚀操作
imshow("效果图", dstImage);
waitKey(0);
return 0;
}

经测试,这里不能使用png图片。

下面的代码进行了均值滤波操作(blur函数),即模糊操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
Mat srcImage = imread("1.jpg");
imshow("原图", srcImage);
Mat dstImage;
blur(srcImage, dstImage, Size(7, 7));
imshow("效果图", dstImage);
waitKey(0);
return 0;
}

 经测试,这里可以使用png图片。

 下面的代码进行了边缘检测。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;

int main()
{
Mat srcImage = imread("迷路帖.png");
imshow("原图", srcImage);
Mat edge, grayImage;
cvtColor(srcImage, grayImage, CV_BGR2GRAY);//将原图转为灰度图像
blur(grayImage, edge, Size(3, 3));//降噪
imshow("灰度图", edge);
Canny(edge, edge, 3, 9, 3);
imshow("效果图", edge);
waitKey(0);
return 0;
}

 下面的代码将视频的每一帧读取出来,当waitkey较小时,效果就是播放视频。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
VideoCapture capture("1.avi");

while (1)
{
Mat frame;
capture >> frame;
imshow("读取视频", frame);
waitKey(30);
}
return 0;
}