與OpenCV的第二天

第一件事:簡單程序上手

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 完整源碼

下載 OpenCV

點擊 **OpenCV for Linux/Mac** 下載最新源碼

2. 生成 Xcode 項目

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

打開 **Xcode** 工程
**Xcode** 工程詳情

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

**matrix.cpp** 文件中 **Mat** 類的某個構造函數

3. 編譯工程

Xcode"command" + "R" 組合鍵,可直接進行編譯,默認是 ALL_BUILD 啟動項,即編譯所有模塊。可更改啟動項,只編譯部分模塊。如下圖:

單擊 **ALL_BUILD**
選中所需模塊

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容