內容提要
本章我們將介紹三個開發實例來檢驗環境搭建是否成功以及爲以後的學習奠定基礎。我們將從最簡單的顯示圖片入手,直到編寫完整的具有一定功能的程序來達到鞏固學習的目的。同時我們也將學習如何將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