第一件事:簡單程序上手
1. 第一個程序:圖像顯示
圖像顯示過程十分簡單,只需 imread 函數載入圖像到數據結構 Mat 類中,然后 imshow 函數顯示即可。
#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. 第二個程序:圖像腐蝕
基本圖形學運算之一,用圖片中暗的部分 腐蝕 掉圖片中亮的部分。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
//載入原圖
cv::Mat srcImg = cv::imread("1.jpg");
cv::imshow("【原圖】腐蝕", srcImg);
//進行腐蝕操作
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(15,15));
cv::Mat dstImg;
cv::erode(srcImg, dstImg, element);
//按下任意鍵后繼續
cv::waitKey();
//顯示效果圖
cv::imshow("【效果圖】腐蝕", dstImg);
cv::waitKey();
return 0;
}
程序首先載入名稱為 1.jpg 的圖片并顯示,之后通過 getStructuringElement 函數生成一個指定形狀和尺寸的結構元素(內核矩陣)。接著調用 erode 函數進行腐蝕操作,最后將結果矩陣顯示。
3. 第三個程序:模糊
對圖像進行均值濾波操作,達到模糊效果。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
//加載原圖并顯示
cv::Mat srcImage = cv::imread("1.jpg");
cv::imshow("【原圖】均值濾波", srcImage);
//按下任意鍵繼續
cv::waitKey();
//均值濾波操作
cv::Mat dstImage;
cv::blur(srcImage, dstImage, cv::Size(21,21));
//顯示結果圖
cv::imshow("【效果圖】均值濾波", dstImage);
cv::waitKey();
return 0;
}
程序依然載入一張名為 1.jpg 的圖片并顯示,之后調用一次 blur 函數生成結果矩陣并顯示。
4. 第四個程序:邊緣檢測
運用 canny 函數進行邊緣檢測。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
//載入原圖并顯示
cv::Mat srcImage = cv::imread("1.jpg");
cv::imshow("【原圖】邊緣", srcImage);
//按任意鍵繼續
cv::waitKey();
//轉化灰度矩陣
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;
}
程序首先載入圖像,并轉換成灰度圖,再用 blur 函數進行降噪,最后用 canny 函數進行邊緣檢測并顯示。
四個簡單的小程序,初窺 OpenCV 。
第二件事:基本視頻操作
主要是通過 VideoCapture 類來對視頻進行讀取和顯示。
1. 讀取并播放視頻
首先初始化一個 VideoCapture 變量,然后循環讀取每一幀并顯示。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
cv::VideoCapture capture;
capture.open("1.mp4");
//或構造函數初始化
//cv::VideoCapture capture("1.mp4");
//循環顯示每一幀
while (1) {
//定義 Mat 變量
cv::Mat frame;
//輸出一幀到 frame 中
capture>>frame;
//顯示當前幀
cv::imshow("視頻", frame);
//延遲30ms
cv::waitKey(30);
}
return 0;
}
2. 調用攝像頭采集圖像
我們只需要將上述代碼中的 "1.mp4" 替換成 0 即可。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
cv::VideoCapture capture;
capture.open(0);
//或構造函數初始化
//cv::VideoCapture capture(0);
//循環顯示每一幀
while (1) {
//定義 Mat 變量
cv::Mat frame;
//輸出一幀到 frame 中
capture>>frame;
//顯示當前幀
cv::imshow("視頻", frame);
//延遲30ms
cv::waitKey(30);
}
return 0;
}
3. 在視頻上加一些處理
對每一幀進行邊緣檢測之后再顯示即可。
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
cv::VideoCapture capture;
capture.open(0);
//或構造函數初始化
//cv::VideoCapture capture(0);
//循環顯示每一幀
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 可以方便的對源代碼進行查看、更改及編譯。
1. 下載 OpenCV 完整源碼
2. 生成 Xcode 項目
下載之后首先解壓縮,并在 OpenCV-x.x.x 目錄下創建 xcode 文件夾,打開 mac 的終端,cd 命令進入剛剛創建的 xcode 目錄執行如下命令(這里就用到了之前下載的cmake)。
cmake -G "Xcode" ..
耐心等待..
完成之后,進入 xcode 目錄,找到 .xcodeproj 文件并打開。
在工程目錄下就可以選擇一個感興趣的項目查看其源碼,比如 opencv_core 模塊,打開 modules/opencv_core/Src/matrix.cpp 查看源代碼。
3. 編譯工程
Xcode 中 "command" + "R" 組合鍵,可直接進行編譯,默認是 ALL_BUILD 啟動項,即編譯所有模塊。可更改啟動項,只編譯部分模塊。如下圖:
編譯成功之后會在工程目錄 lib/debug 目錄下生成本次編譯的 OpenCV 依賴庫,可供以后使用。