第一件事:簡單程序上手
1. 第一個程序:圖像顯示
圖像顯示過程十分簡單,只需 imread 函數(shù)載入圖像到數(shù)據(jù)結(jié)構(gòu) Mat 類中,然后 imshow 函數(shù)顯示即可。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
cv::Mat img = cv::imread("1.jpg"); //imread 載入圖片
cv::imshow("載入的圖片", img); //imshow 展示圖片
cv::waitKey(0); //等待任意鍵按下
return 0;
}
放置一張圖片,并改名為程序中的 1.jpg 之后,運行程序。

2. 第二個程序:圖像腐蝕
基本圖形學(xué)運算之一,用圖片中暗的部分 腐蝕 掉圖片中亮的部分。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
//載入原圖
cv::Mat srcImg = cv::imread("1.jpg");
cv::imshow("【原圖】腐蝕", srcImg);
//進(jìn)行腐蝕操作
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15,15));
cv::Mat dstImg;
cv::erode(srcImg, dstImg, element);
//按下任意鍵后繼續(xù)
cv::waitKey();
//顯示效果圖
cv::imshow("【效果圖】腐蝕", dstImg);
cv::waitKey();
return 0;
}
程序首先載入名稱為 1.jpg 的圖片并顯示,之后通過 getStructuringElement 函數(shù)生成一個指定形狀和尺寸的結(jié)構(gòu)元素(內(nèi)核矩陣)。接著調(diào)用 erode 函數(shù)進(jìn)行腐蝕操作,最后將結(jié)果矩陣顯示。


3. 第三個程序:模糊
對圖像進(jìn)行均值濾波操作,達(dá)到模糊效果。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
//加載原圖并顯示
cv::Mat srcImage = cv::imread("1.jpg");
cv::imshow("【原圖】均值濾波", srcImage);
//按下任意鍵繼續(xù)
cv::waitKey();
//均值濾波操作
cv::Mat dstImage;
cv::blur(srcImage, dstImage, cv::Size(21,21));
//顯示結(jié)果圖
cv::imshow("【效果圖】均值濾波", dstImage);
cv::waitKey();
return 0;
}
程序依然載入一張名為 1.jpg 的圖片并顯示,之后調(diào)用一次 blur 函數(shù)生成結(jié)果矩陣并顯示。


4. 第四個程序:邊緣檢測
運用 canny 函數(shù)進(jìn)行邊緣檢測。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
//載入原圖并顯示
cv::Mat srcImage = cv::imread("1.jpg");
cv::imshow("【原圖】邊緣", srcImage);
//按任意鍵繼續(xù)
cv::waitKey();
//轉(zhuǎn)化灰度矩陣
cv::cvtColor(srcImage, grayImage, cv::COLOR_BGR2GRAY);
//降噪
cv::blur(grayImage, edge, cv::Size(3,3));
//canny算子
cv::Canny(edge, edge, 3, 9,3);
//展示效果圖
cv::imshow("【效果圖】邊緣", edge);
cv::waitKey();
return 0;
}
程序首先載入圖像,并轉(zhuǎn)換成灰度圖,再用 blur 函數(shù)進(jìn)行降噪,最后用 canny 函數(shù)進(jìn)行邊緣檢測并顯示。


四個簡單的小程序,初窺 OpenCV 。
第二件事:基本視頻操作
主要是通過 VideoCapture 類來對視頻進(jìn)行讀取和顯示。
1. 讀取并播放視頻
首先初始化一個 VideoCapture 變量,然后循環(huán)讀取每一幀并顯示。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
cv::VideoCapture capture;
capture.open("1.mp4");
//或構(gòu)造函數(shù)初始化
//cv::VideoCapture capture("1.mp4");
//循環(huán)顯示每一幀
while (1) {
//定義 Mat 變量
cv::Mat frame;
//輸出一幀到 frame 中
capture>>frame;
//顯示當(dāng)前幀
cv::imshow("視頻", frame);
//延遲30ms
cv::waitKey(30);
}
return 0;
}

2. 調(diào)用攝像頭采集圖像
我們只需要將上述代碼中的 "1.mp4" 替換成 0 即可。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
cv::VideoCapture capture;
capture.open(0);
//或構(gòu)造函數(shù)初始化
//cv::VideoCapture capture(0);
//循環(huán)顯示每一幀
while (1) {
//定義 Mat 變量
cv::Mat frame;
//輸出一幀到 frame 中
capture>>frame;
//顯示當(dāng)前幀
cv::imshow("視頻", frame);
//延遲30ms
cv::waitKey(30);
}
return 0;
}
3. 在視頻上加一些處理
對每一幀進(jìn)行邊緣檢測之后再顯示即可。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
cv::VideoCapture capture;
capture.open(0);
//或構(gòu)造函數(shù)初始化
//cv::VideoCapture capture(0);
//循環(huán)顯示每一幀
while (1) {
//定義 Mat 變量
cv::Mat frame;
//輸出一幀到 frame 中
capture>>frame;
//邊緣檢測
cv::Mat edge,grayImg;
cv::cvtColor(frame, grayImg, cv::COLOR_BGR2GRAY);
cv::blur(grayImg, edge, cv::Size(3,3));
cv::Canny(edge, edge, 3, 9, 3);
//顯示效果圖
cv::imshow("邊緣", edge);
//延遲30ms
cv::waitKey(30);
}
return 0;
}

第三件事:生成Xcode項目,查看并編譯 OpenCV 源碼
在之前下載的 OpenCV 中并不包含源碼,所以需要下載 OpenCV 完整源碼,并通過 cmake(開源并且跨平臺的安裝編譯工具) 來生成 Xcode 項目。通過 Xcode 可以方便的對源代碼進(jìn)行查看、更改及編譯。
1. 下載 OpenCV 完整源碼

2. 生成 Xcode 項目
下載之后首先解壓縮,并在 OpenCV-x.x.x 目錄下創(chuàng)建 xcode 文件夾,打開 mac 的終端,cd 命令進(jìn)入剛剛創(chuàng)建的 xcode 目錄執(zhí)行如下命令(這里就用到了之前下載的cmake)。
cmake -G "Xcode" ..
耐心等待..
完成之后,進(jìn)入 xcode 目錄,找到 .xcodeproj 文件并打開。


在工程目錄下就可以選擇一個感興趣的項目查看其源碼,比如 opencv_core 模塊,打開 modules/opencv_core/Src/matrix.cpp 查看源代碼。

3. 編譯工程
Xcode 中 "command" + "R" 組合鍵,可直接進(jìn)行編譯,默認(rèn)是 ALL_BUILD 啟動項,即編譯所有模塊??筛膯禹?,只編譯部分模塊。如下圖:


編譯成功之后會在工程目錄 lib/debug 目錄下生成本次編譯的 OpenCV 依賴庫,可供以后使用。