内容提要
本章我们将介绍三个开发实例来检验环境搭建是否成功以及为以后的学习奠定基础。我们将从最简单的显示图片入手,直到编写完整的具有一定功能的程序来达到巩固学习的目的。同时我们也将学习如何将PC端的程序移植到树莓派上进行运行。
4.1 创建工程
4.1.1创建Visual Studio工程
启动Visual Studio2015,新建一个项目。注意在工程创建界面设置好路径以免创建完成后找不到工程。
在出现的对话框中,点击下一步。
在第二个对话框中勾选附加选项中的“空项目”。
然后选择 生成-配置管理器。
点击新建,在对话框中选择“x64”并确定。若已经有了x64,选中后关闭即可。
然后点击视图-其它窗口-属性管理器,依次展开<工程名>-Debug|x64-Microsoft.Cpp.x64.user,然后右击,选择属性。
点击属性管理器中的VC++目录-包含目录,右边会出现三角。点击下拉三角-编辑,在新对话框中点击空行,然后输入:
D:\opencv\build\include
D:\opencv\build\include\opencv
D:\opencv\build\include\opencv2
类似的,在VC++目录-库目录中输入(Visual Studio 2013将vc14改为vc12):
D:\opencv\build\x64\vc14\lib
随后按照相似方法修改链接器配置,在链接器-输入-附加依赖项中输入:
opencv_world310.lib
然后确定,保存所有更改,配置完成。建议将工程复制多份避免以后设置的麻烦。
4.1.2 创建Qt工程
在新弹出的对话框中依次选择Application-Qt Console Application,然后点击Choose。然后输入项目名称和路径,点击下一步。选择刚才上一章已经配置好的构建套件(我的叫做123),点击下一步。最后点击完成。
此时已经创建了一个新项目。双击项目中的pro文件,删除文件中的所有代码,然后粘贴入以下代码:
QT += core
QT -= gui
TARGET = test
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
INCLUDEPATH +=/usr/local/include \
/usr/local/include/opencv \
/usr/local/include/opencv2
LIBS +=/usr/local/lib/libopencv_highgui.so \
/usr/local/lib/libopencv_core.so \
/usr/local/lib/libopencv_imgproc.so \
/usr/local/lib/libopencv_imgcodecs.so\
/usr/local/lib/libopencv_videoio.so \
/usr/local/lib/libopencv_video.so \
/usr/local/lib/libopencv_videostab.so \
/usr/local/lib/libopencv_calib3d.so \
/usr/local/lib/libopencv_features2d.so\
/usr/local/lib/libopencv_flann.so \
/usr/local/lib/libopencv_ml.so \
/usr/local/lib/libopencv_objdetect.so \
/usr/local/lib/libopencv_photo.so \
/usr/local/lib/libopencv_shape.so \
/usr/local/lib/libopencv_stitching.so \
/usr/local/lib/libopencv_superres.so
最后保存退出。建议将此工程复制多份避免每次操作的麻烦。
4.2 显示图片
本节为测试例程,主要用来检验环境配置是否成功。
PC端操作方法:
首先使用Visual Studio打开上一章创建好的工程(或者重新按照过程重新创建一个)。在右侧“解决方案资源管理器”中的test1-源文件处右击,点击添加-新建项。如果找不到“解决方案资源管理器”,点击“视图”菜单即可找到。
在弹出的对话框中选择C++文件,然后修改名称(可选),点击添加按钮。
在新创建的cpp文件中输入以下代码:
#include<opencv2/opencv.hpp> //头文件
#include"iostream"
using namespace std;
using namespace cv; //包含cv命名空间
void main()
{
cout << "hello world!";
// 【1】读入一张图片,载入图像
Mat srcImage = imread("1.jpg");
// 【2】显示载入的图片
imshow("【原始图】",srcImage);
// 【3】等待任意按键按下
waitKey(0);
}
然后在对应的工程存放文件夹下的test1(随工程名而变)文件夹放置一张图片,重命名为1.jpg。
然后回到Visual Studio界面,选择x64,点击“本地Windows调试器”。
出现如下界面,即证明配置成功。
树莓派端操作方法:
打开Qt,再打开创建好的工程(pro文件);或者直接将pro文件拖放到Qt软件的快捷方式上。然后双击打开main.cpp,将原有代码删除,然后粘贴入以下代码:
#include<opencv2/opencv.hpp>
#include"iostream"
using namespace std;
using namespace cv;
int main()
{
cout << "hello world!";
Mat srcImage = imread("1.jpg");
imshow("original picture", srcImage);
waitKey(0);
}
然后点击绿色的三角开始构建。发现程序报错,这是因为我们没有将引用的图片放在构建目录中。一般来说,构建目录会在存放工程的文件夹里。找到该文件夹,将图片1.jpg放入,再次构建运行,程序运行成功。
4.3 边缘检测
本例程用来演示OpenCV的基础功能:边缘检测。
打开附录中提供的文件test2.sln,在解决方案管理器中依次展开test2-源文件,然后打开源.cpp,阅读并体会代码(有注释)。
然后选择x64,点击本地Windows调试器,出现如图 4 - 22的画面即证明成功。
如果报错,请按住ctrl后单击此处重新配置。
按照4.1节的步骤将程序移植到树莓派上,观察现象。
4.4 基于OpenCV和摄像头的消灭圆圈游戏
本节将介绍一个综合示例,主要包含了基于光流法的动作检测算法和基于Lukas-Kanade光流法的颜色检测算法的原理。
光流是一种简单实用的图像运动的表达方式,通常定义为一个图像序列中的图像亮度模式的表观运动。光流法检测运动物体的基本原理是:给图像中的每一个像素点赋予一个速度矢量,形成一个图像运动场,在运动的一个特定时刻,图像上的点与三维物体上的点一一对应,根据各个像素点的速度矢量特征,可以对图像进行动态分析。如果图像中没有运动物体,则光流矢量在整个图像区域是连续变化的。当图像中有运动物体时,目标和图像背景存在相对运动,运动物体所形成的速度矢量必然和邻域背景速度矢量不同,进而检测出运动物体及位置。光流法的优点在于光流不仅携带了运动物体的运动信息,还携带了有关景物三维结构的丰富信息,它能够在不知道场景的任何信息的情况下,检测出运动对象。
具体功能:开启程序后,程序首先显示使用说明,随后通过摄像头获取画面,在窗口1上显示实时画面,并显示基于图像颜色信息的圆圈以及显示当前圆圈数量。用户通过挥动手臂将圆圈清除,当画面上的圆圈数量为0时,显示游戏成功信息,提示可以进行下一次游戏。与此同时,在窗口2上显示出用户手臂的运动轨迹,便于进一步分析。
打开附录中提供的test3.sln,按照4.2节中的步骤操作,观察现象。请注意,因为未知BUG,调试时需要设置为以下状态:
按照4.1节的步骤将程序移植到树莓派上,观察现象。
工程文件:
链接:http://pan.baidu.com/s/1qXKEvDE 密码:4g13