與OpenCV的第二天

第一件事:簡單程序上手

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

下載 OpenCV

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

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 文件并打開。

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

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

**matrix.cpp** 文件中 **Mat** 類的某個構(gòu)造函數(shù)

3. 編譯工程

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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容