0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenCV學習總結(jié)之C++版

jf_78858299 ? 來源:鬼才薛定諤 ? 作者: CatalinChao ? 2023-02-07 16:03 ? 次閱讀

本文中代碼所采用的是OpenCV4.6.0,采用Cmake來管理工程,mac系統(tǒng)

OpenCV簡介

OpenCV是“開源計算機視覺庫”,「Open Sourec Computer Vision Library」,是一個基于開源發(fā)行的跨平臺計算機視覺庫,包含了許多圖像處理和計算機視覺方面的通用算法,這里主要學習其api的應(yīng)用。

快速上手OpenCV圖像處理

  • 第一個程序:圖像顯示,代碼如下
//
// Created by on 2022/11/9.
//
#include     //相關(guān)頭文件
using namespace std;


int main() {
    cv::Mat srcImage = cv::imread("../dog.jpg"); //載入圖像
    cv::imshow("[原始圖]", srcImage);  //顯示圖像
    cv::waitKey(0); //等待用戶任意鍵按下才終止窗口
    return 0;

}
  • 第二個程序:圖像腐蝕

腐蝕是最基本的形態(tài)學運算之一:就是用圖像中的暗色部分“腐蝕”掉圖像中的高亮部分

部分。

顯示效果如上圖

代碼如下:

//
// Created by  on 2022/11/9.
//
#include      //模塊頭文件
#include       //圖像處理頭文件
//using namespace cv;    //cv命名空間

int main() {
//載入原圖,保存在Mat矩陣類對象中
    cv::Mat srcImage = cv::imread("../cat.jpeg");
//顯示原圖
    cv::imshow("faster",srcImage);
//進行腐蝕操作
    cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT,cv::Size(15, 15));
    cv::Mat dstImage;
    cv::erode(srcImage, dstImage, element);
//顯示效果圖
    cv::imshow("laster", dstImage);
    cv::waitKey(0);
return 0;
}

getStructuringElement函數(shù)返回一個指定形狀和尺寸的內(nèi)核矩陣,然后調(diào)用erode函數(shù)進行圖像腐蝕操作。

  • 第三個程序:圖像模糊
    對圖像進行均值濾波操作,主要使用到blur函數(shù)

代碼如下:

//
// Created by on 2022/11/9.
//

#include 
#include 

//using namespace cv;

int main() {
    cv::Mat srcImage = cv::imread("../cat.jpeg");
    cv::imshow("src picture", srcImage);

//進行均值濾波操作
    cv::Mat dstImage;
    cv::blur(srcImage, dstImage, cv::Size(7, 7));

//顯示效果圖
    cv::imshow("last picture", dstImage);
    cv::waitKey(0);
return 0;
}

先載入圖像,并將其轉(zhuǎn)成灰度圖,再用blur函數(shù)進行圖像模糊以降噪,然后用canny函數(shù)進行邊緣檢測,最后進行顯示

代碼如下:

//
// Created by  on 2022/11/9.
//

#include 
#include 

//using namespace std;

int main() {
    cv::Mat srcImage = cv::imread("../cat.jpeg");
    cv::imshow("canny test", srcImage);  //顯示原始圖
//將原始圖像轉(zhuǎn)化為灰度圖像
    cv::Mat dstImage, edge, grayImage;
//創(chuàng)建與原圖同類型和大小的矩陣 dst
    dstImage.create(srcImage.size(), srcImage.type());

//將原圖像轉(zhuǎn)換為灰度圖像
    cv::cvtColor(srcImage, grayImage, cv::COLOR_BGR2GRAY);

//先使用3x3的內(nèi)核矩陣來降噪
    cv::blur(grayImage, edge, cv::Size(3, 3));

//運行Canny 算子
    cv::Canny(edge, edge, 3, 9, 3);

//顯示效果圖
    cv::imshow("edge test", edge);
    cv::waitKey(0);
return 0;
}
  • 第五個程序:讀取并播放視頻
    使用VideoCapture從視頻文件或攝像頭捕獲視頻并顯示出來

有兩種寫法,分別是:

  1. 先實例化,再初始化

VideoCapture video; video.open("one.mp4");

  1. 在實例化的同時進行初始化

VideoCapture video("one.mp4");

視頻讀入到VideoCapture類對象之后,緊接著可以用一個循環(huán)將每一幀顯示出來,相關(guān)代碼如下:

等)時,在頭部直接指定,如:```javascript,如下:

//
// Created by 方 on 2022/11/9.
//
#include

using namespace cv;

int main() {
//1. 讀入視頻
VideoCapture video("../one.mov");

//2. 循環(huán)顯示每一幀
while(1) {
        Mat frame; //定義一個Mat對象,用來存儲每一幀圖像
        video>>frame; //讀取當前幀
        imshow("read_video", frame); //顯示當前幀
        waitKey(30); //延時30ms

    }
return 0;
}
  • 第六個程序:調(diào)用攝像頭采集圖像

只需將上述代碼中的視頻文件名“one.mov”換成0就行,即VideoCapture(0)表示調(diào)用攝像頭而不是從文件中讀取視頻, 注意不要添加""

結(jié)合攝像頭調(diào)用實例程序來配合canny邊緣檢測,得到canny邊緣檢測并高斯模糊后的攝像頭采集視頻,代碼如下:

//
// Created by  on 2022/11/9.
//
#include 

int main() {
    //從攝像頭讀入視頻
    cv::VideoCapture video(0);
    cv::Mat edge;

    //循環(huán)顯示每一幀
    while(1) {
        //1. 讀入圖像
        cv::Mat frame;  //定義一個Mat變量,用于存儲每一幀的圖像
        video >> frame;     //讀取當前幀

        //2. 將原圖轉(zhuǎn)換成灰度圖
        cv::cvtColor(frame, edge, cv::COLOR_BGR2GRAY);

        //3. 使用3x3的內(nèi)核矩陣來進行降噪 2x3+1=7
        cv::blur(edge, edge, cv::Size(7,7)); //進行模糊

        //4. 進行canny邊緣檢測并顯示
        cv::Canny(edge, edge, 0, 30, 3);
        cv::imshow("the video after canny", edge); //顯示經(jīng)過處理后的當前幀
        if(cv::waitKey(30) >= 0)
            break;   //延時30ms
    }
    return 0;
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 圖像處理
    +關(guān)注

    關(guān)注

    27

    文章

    1272

    瀏覽量

    56509
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1466

    瀏覽量

    61688
  • 開源
    +關(guān)注

    關(guān)注

    3

    文章

    3188

    瀏覽量

    42244
  • OpenCV
    +關(guān)注

    關(guān)注

    29

    文章

    623

    瀏覽量

    41181
收藏 人收藏

    評論

    相關(guān)推薦

    關(guān)于C++模板總結(jié)

    大家好,今天給大家分享一篇關(guān)于 C++ 模板總結(jié)概述。
    發(fā)表于 09-19 11:55 ?471次閱讀

    C++STL算法(二)

    C++STL算法(二)
    的頭像 發(fā)表于 07-18 14:49 ?920次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>STL算法(二)

    C++文件操作

    C++文件操作
    的頭像 發(fā)表于 07-21 10:52 ?1058次閱讀
    <b class='flag-5'>C++</b><b class='flag-5'>之</b>文件操作

    OpenCV C++程序編譯與演示

    1、在JetsonNano上編譯OpenCV源碼與OpenCV C++ YOLOv5程序演示  編譯OpenCV最新4.5.x版本  Jetson Nano自帶的
    發(fā)表于 11-10 16:42

    CC++學習過程總結(jié)

      總是被同學們問到,如何學習CC++才不茫然,才不是亂學,想了一下,這里給出一個總的回復。   一家之言,歡迎拍磚哈。   1、可以考慮先學習
    發(fā)表于 09-10 11:42 ?1234次閱讀

    OpenCV2.3的C++速查表免費下載

    本文檔的主要內(nèi)容詳細介紹的是OpenCV2.3的C++速查表免費下載。
    發(fā)表于 11-06 17:48 ?4次下載

    C++指針的學習建議

     一。對于眾多人提出的c/c++中指針難學的問題做個總結(jié)
    發(fā)表于 11-07 17:13 ?8次下載
    <b class='flag-5'>C++</b>指針的<b class='flag-5'>學習</b>建議

    如何使用Borland C++ Builder6.0來開發(fā)OpenCV的程序

    本文檔的主要內(nèi)容詳細介紹的是如何使用Borland C++ Builder6.0來開發(fā)OpenCV的程序。
    發(fā)表于 05-26 17:32 ?14次下載
    如何使用Borland <b class='flag-5'>C++</b> Builder6.0來開發(fā)<b class='flag-5'>OpenCV</b>的程序

    C++中類的繼承訪問級別學習總結(jié)(二)

    上一篇文章我們介紹了c++中類的繼承學習總結(jié);今天我們繼續(xù)來分享c++中類的繼承中的訪問級別的學習總結(jié)
    的頭像 發(fā)表于 12-24 16:10 ?685次閱讀

    C++重載函數(shù)學習總結(jié)

    函數(shù)重載是c++c的一個重要升級;函數(shù)重載通過參數(shù)列表區(qū)分不同的同名函數(shù);extern關(guān)鍵字能夠?qū)崿F(xiàn)cc++的相互調(diào)用;編譯方式?jīng)Q定符號表中的函數(shù)名的最終目標名
    的頭像 發(fā)表于 12-24 17:10 ?759次閱讀

    C++靜態(tài)成員變量和靜態(tài)成員函數(shù)學習總結(jié)

    今天繼續(xù)分享c++的文章,學習還是不能落下,flag未完成,任務(wù)艱巨,好好學習。
    的頭像 發(fā)表于 12-24 17:12 ?408次閱讀

    Linux C/C++ 學習路線

    一、秋招 Linux C/C++ offer 情況二、Linux C/C++ 方向的一些思考三、計算機基礎(chǔ)知識的梳理四、C++ 方向的深入
    發(fā)表于 11-06 19:36 ?14次下載
    Linux <b class='flag-5'>C</b>/<b class='flag-5'>C++</b> <b class='flag-5'>學習</b>路線

    運用JNI連結(jié)OpenCV開發(fā)C++并打包成aar lib的使用教學

    本身是作影像視覺相關(guān)的工作,多數(shù)時候都使用 Python 作為開發(fā)語言,但OpenCV 本身是C++開發(fā),學 C++ 應(yīng)該有幫助。
    的頭像 發(fā)表于 08-15 09:24 ?1477次閱讀

    C++學習筆記c++的基本認識

    自這篇文章我們即將開始C++的奇幻之旅,其內(nèi)容主要是讀C++ Primer的總結(jié)和筆記,有興趣可以找原版書看看,對于學習C++還是有很大幫助
    的頭像 發(fā)表于 03-17 13:57 ?680次閱讀

    OpenCV圖像識別C++代碼

    的頭文件 在您的C++代碼中,包含以下必要的頭文件: # include # include # include # include # include # include # include 讀取圖像
    的頭像 發(fā)表于 07-16 10:42 ?1438次閱讀