国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《OpenCV 計算機視覺編程攻略》學習筆記(一:圖像編程入門)

這篇具有很好參考價值的文章主要介紹了《OpenCV 計算機視覺編程攻略》學習筆記(一:圖像編程入門)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

參考引用

  • OpenCV 計算機視覺編程攻略(第3版)

說明

  • 本書結合 C++ 和 OpenCV 3.2 全面講解計算機視覺編程
  • 所有代碼均在 Ubuntu 系統(tǒng)中用 g++ 編譯執(zhí)行

0. 安裝 OpenCV 庫

  • 在Ubuntu上安裝OpenCV及使用
  • OpenCV 庫分為多個模塊,常見模塊如下
    • opencv_core 模塊包含庫的核心功能
    • opencv_imgproc 模塊包含主要的圖像處理函數(shù)
    • opencv_highgui 模塊提供了讀寫圖像和視頻的函數(shù)以及一些用戶交互函數(shù)

1. 裝載、顯示和存儲圖像

// loadDisplaySave.cpp
#include <iostream>

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

/*** 在圖像上點擊(讓鼠標在置于圖像窗口上時運行特定的指令)***/
/*  
    定義一個回調函數(shù) onMouse,回調函數(shù)不會被顯式地調用,在響應特定事件時被程序調用
        參數(shù)一:觸發(fā)回調函數(shù)的鼠標事件的類型
        參數(shù)二、三:事件發(fā)生時鼠標的位置,用像素坐標表示
        參數(shù)四:表示事件發(fā)生時按下了鼠標的哪個鍵
        參數(shù)五:指向任意對象的指針,作為附加的參數(shù)發(fā)送給函數(shù)
*/
void onMouse(int event, int x, int y, int flags, void* param) {
    // reinterpret_cast 用于將任意類型的指針轉換為其他類型的指針
    // 將一個 void* 類型的指針轉換成了一個 cv::Mat* 類型的指針
    // 并將其賦值給了變量 im,這樣就可以通過 im 來訪問 cv::Mat 對象
    cv::Mat *im = reinterpret_cast<cv::Mat*>(param);
    
    switch (event) { // 調度事件
        case cv::EVENT_LBUTTONDOWN: // 鼠標左鍵按下事件
            // 顯示像素值(x, y)
            std::cout << "at (" << x << "," << y << ") value is: "
                      << static_cast<int>(im->at<uchar>(cv::Point(x,y))) << std::endl; 
            break;
    }
}

int main(int argc, char *argv[]) {
    // cv::Mat 是 OpenCV 定義的用于表示任意維度的稠密數(shù)組,OpenCV 使用它來存儲和傳遞圖像
    cv::Mat image; // 創(chuàng)建一個尺寸為 0 × 0 空圖像
    std::cout << "This image is " << image.rows << " x " << image.cols << std::endl;
    
    // 讀入一個圖像文件并將其轉換為灰度圖像
    // 這樣生成的圖像由無符號字節(jié)構成,在 OpenCV 中用常量 CV_8U 表示
    image = cv::imread("puppy.bmp", cv::IMREAD_GRAYSCALE);
    
    /*  讀取圖像,并將其轉換為三通道彩色圖像
        這樣創(chuàng)建的圖像中,每個像素有 3 字節(jié),OpenCV 中用 CV_8UC3 表示
    image = cv::imread("puppy.bmp", cv::IMREAD_COLOR); 
    */

    if (image.empty()) { // 如果沒有分配圖像數(shù)據(jù),empty 方法將返回 true
        std::cout << "Error reading image..." << std::endl;
        return 0;
    }

    std::cout << "This image is " << image.rows << " x " << image.cols << std::endl;
    // 使用 channels 方法檢查圖像的通道數(shù)
    std::cout << "This image has " << image.channels() << " channel(s)" << std::endl;

    cv::namedWindow("Original Image"); // 定義窗口(可選)
    cv::imshow("Original Image", image); // 顯示圖像

    // 回調函數(shù)注冊
    // 函數(shù) onMouse 與 Original Image 圖像窗口建立關聯(lián),同時把所顯示圖像的地址作為附加參數(shù)傳給函數(shù)
    cv::setMouseCallback("Original Image", onMouse, reinterpret_cast<void*>(&image));

    cv::Mat result; // 創(chuàng)建另一個空的圖像
    cv::flip(image, result, 1); // 正數(shù) 1 表示水平翻轉,0 表示垂直翻轉,負數(shù)表示水平和垂直翻轉
    // cv::flip(image, image, 1); // 對輸入圖片就地處理,直接寫入原圖像
    cv::namedWindow("Output Image");
    cv::imshow("Output Image", result);
    cv::waitKey(0); // 0 表示永遠的等待按鍵,鍵入的正數(shù)表示等待的毫秒數(shù)
    cv::imwrite("output.bmp", result); // 保存結果

    // 在圖像上繪圖(必須包含頭文件 imgproc.hpp)
    cv::namedWindow("Drawing on an Image");
    // 目標圖像,中心點坐標,半徑,顏色,厚度
    cv::circle(image, cv::Point(155, 110), 65, 0, 3);
    // 目標圖像,文本,文本位置,字體類型,字體大小,字體顏色,字體厚度
    cv::putText(image, "This is a dog.", cv::Point(40, 200), 
                cv::FONT_HERSHEY_PLAIN, 2.0, 255, 2);
    cv::imshow("Drawing on an Image", image);
    cv::waitKey(0);

    return 0;
}
# 編譯并執(zhí)行
# 若版本為 OpenCV4.x,則最后改為 opencv4
$ g++ loadDisplaySave.cpp -o test1 `pkg-config --cflags --libs opencv` 
$ ./test1
# 控制臺輸出
This image is 0 x 0
This image is 213 x 320
This image has 1 channel(s)

《OpenCV 計算機視覺編程攻略》學習筆記(一:圖像編程入門)

《OpenCV 計算機視覺編程攻略》學習筆記(一:圖像編程入門)

《OpenCV 計算機視覺編程攻略》學習筆記(一:圖像編程入門)

2. 深入了解 cv::Mat

  • cv::Mat 有兩個必不可少的組成部分:一個頭部和一個數(shù)據(jù)塊
    • 頭部包含了矩陣的所有相關信息(大小、通道數(shù)量、數(shù)據(jù)類型等)
    • 數(shù)據(jù)塊包含了圖像中所有像素的值
    • 頭部有一個指向數(shù)據(jù)塊的指針,即 data 屬性
  • cv::Mat 有一個很重要的屬性:即只有在明確要求時,內存塊才會被復制,實際上,大多數(shù)操作僅僅復制了 cv::Mat 的頭部,因此多個對象會指向同一個數(shù)據(jù)塊
// mat.cpp
#include <iostream>

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

// 測試函數(shù),它創(chuàng)建一幅圖像
cv::Mat function() {
    cv::Mat ima(500, 500, CV_8U, 50); // 創(chuàng)建圖像
    return ima; // 返回圖像
}

int main(int argc, char *argv[]) {
    // 創(chuàng)建一個 240 行 × 320 列的新圖像
    // CV_8U 表示每個像素對應 1 字節(jié)(灰度圖像),U 表示無符號
    // cv::Size 結構包含了矩陣高度和寬度,同樣可以提供圖像的尺寸信息
    cv::Mat image1(240, 320, CV_8U, 100);
    // cv::Mat image1(cv::Size(240, 320), CV_8UC3);
    cv::imshow("Image", image1);
    cv::waitKey(0);
    
    // 隨時可以用 create 方法分配或重新分配圖像的數(shù)據(jù)塊
    // 如果新的尺寸和類型與原來的相同,就不會重新分配內存
    image1.create(200, 200, CV_8U);
    image1 = 200;
    cv::imshow("Image", image1);
    cv::waitKey(0);

    // 創(chuàng)建一個紅色的圖像 (通道次序為 BGR)
    // 數(shù)據(jù)結構 cv::Scalar 用于在調用函數(shù)時傳遞像素值
    cv::Mat image2(240, 320, CV_8UC3, cv::Scalar(0, 0, 255));
    cv::imshow("Image", image2);
    cv::waitKey(0);

    // 讀入一幅圖像
    cv::Mat image3 = cv::imread("puppy.bmp");
    // 所有這些圖像都指向同一個數(shù)據(jù)塊,通過 cv::Mat 實現(xiàn)計數(shù)引用和淺復制
    // 只有當圖像的所有引用都將釋放或賦值給另一幅圖像時,內存才會被釋放
    cv::Mat image4(image3);
    image1 = image3;

    // 這些圖像是源圖像的副本圖像
    // 1. 如果要對圖像內容做一個深復制,可以使用 copyTo 方法
    image3.copyTo(image2);
    // 2. 另一個生成圖像副本的方法是 clone
    cv::Mat image5 = image3.clone();

    // 轉換圖像進行測試
    cv::flip(image3, image3, 1);
    // 檢查哪些圖像在處理過程中受到了影響
    cv::imshow("Image 3", image3);
    cv::imshow("Image 1", image1);
    cv::imshow("Image 2", image2);
    cv::imshow("Image 4", image4);
    cv::imshow("Image 5", image5);
    cv::waitKey(0);

    // 從函數(shù)中獲取一個灰度圖像
    // 運行這條語句后,就可用變量 gray 操作由 function 函數(shù)創(chuàng)建的圖像,而不需要額外分配內存
    cv::Mat gray = function();
    cv::imshow("Image", gray);
    cv::waitKey(0);

    // 作為灰度圖像讀入
    image1 = cv::imread("puppy.bmp", CV_LOAD_IMAGE_GRAYSCALE);
    // 如果要把一幅圖像復制到另一幅圖像中,且兩者的數(shù)據(jù)類型不相同,那就使用 convertTo 方法
    // 轉換成浮點型圖像 [0,1],這兩幅圖像的通道數(shù)量必須相同
    image1.convertTo(image2, CV_32F, 1/255.0, 0.0); // 兩個可選參數(shù):縮放比例、偏移量
    cv::imshow("Image", image2);

    // 3×3 雙精度型矩陣
    cv::Matx33d matrix(3.0, 2.0, 1.0, 
                       2.0, 1.0, 3.0,
                       1.0, 2.0, 3.0);
    // 3×1 矩陣(即向量)
    cv::Matx31d vector(5.0, 1.0, 3.0);
    cv::Matx31d result = matrix * vector;
    std::cout << result;
    cv::waitKey(0);

    return 0;
}
# 編譯并執(zhí)行
# 若版本為 OpenCV4.x,則最后改為 opencv4
$ g++ mat.cpp -o test2 `pkg-config --cflags --libs opencv` 
$ ./test2
# 控制臺輸出
[20;
 20;
 16]
  • 在使用類的時候不要返回圖像的類屬性
    • 如果某個函數(shù)調用了這個類的 method ,就會對圖像屬性進行一次淺復制。副本一旦被修改,class 屬性也會被 “偷偷地” 修改,這會影響這個類的后續(xù)行為
    class Test {
        // 圖像屬性
        cv::Mat ima;
    public:
        // 在構造函數(shù)中創(chuàng)建一幅灰度圖像
        Test() : ima(240, 320, CV_8U, cv::Scalar(100)) {}
        // 用這種方法返回一個類屬性,這是一種不好的做法
        cv::Mat method() {
            return ima;
        }
    };
    

3. 定義感興趣區(qū)域

  • 有時需要讓一個處理函數(shù)只在圖像的某個部分起作用。OpenCV 內嵌了一個精致又簡潔的機制,可以定義圖像的子區(qū)域,并把這個子區(qū)域當作普通圖像進行操作
  • 假設要把一個小圖像復制到一個大圖像上,為實現(xiàn)這個功能
    • 定義一個感興趣區(qū)域(Region Of Interest,ROI),在此處進行復制操作,ROI 的位置將決定標志的插入位置
      • 定義 ROI 的一種方法是使用 cv::Rect 實例:通過指明左上角的位置(構造函數(shù)的前兩個參數(shù))和矩形的尺寸(后兩個參數(shù)表示寬度和高度),描述了一個矩形區(qū)域,整個 ROI 肯定處于父圖像的內部
      • ROI 還可以用行和列的值域來描述:值域是一個從開始索引到結束索引的連續(xù)序列(不含開始值和結束值),可以用 cv::Range 結構來表示這個概念

    由于圖像和 ROI 共享了同一塊圖像數(shù)據(jù),因此 ROI 的任何轉變都會影響原始圖像的相關區(qū)域

  • OpenCV 中函數(shù)或方法通常對圖像中所有的像素進行操作,通過定義掩碼可以限制這些函數(shù)或方法的作用范圍
    • 掩碼是一個 8 位圖像,如果掩碼中某個位置的值不為 0,在這個位置上的操作就會起作用;如果掩碼中某些像素位置的值為 0,那么對圖像中相應位置的操作將不起作用
    • 例如,在調用 copyTo 方法時就可以使用掩碼,可以利用掩碼只復制標志中白色的部分,因為標志的背景是黑色的(因此值為 0 ),所以很容易同時作為被復制圖像和掩碼來使用
// logo.cpp
#include <iostream>

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

int main(int argc, char *argv[]) {
    cv::namedWindow("Image");
    cv::Mat image = cv::imread("puppy.bmp");
    cv::Mat logo = cv::imread("smalllogo.png");

    // 在圖像的右下角定義一個 ROI
    // image 是目標圖像, logo 是標志圖像
    cv::Mat imageROI(image, cv::Rect(image.cols - logo.cols, // ROI 坐標
                                     image.rows - logo.rows,
                                     logo.cols, logo.rows)); // ROI 大小
    /*imageROI = image(cv::Range(image.rows-logo.rows,image.rows),
                       cv::Range(image.cols-logo.cols,image.cols));*/
    logo.copyTo(imageROI); // 插入標志
    cv::imshow("Image", image);
    cv::waitKey(0);

    image = cv::imread("puppy.bmp");
    // 在圖像的右下角定義一個 ROI
    imageROI = image(cv::Rect(image.cols - logo.cols,
                              image.rows - logo.rows,
                              logo.cols, logo.rows));
    // 把標志作為掩碼(必須是灰度圖像)
    cv::Mat mask(logo);
    logo.copyTo(imageROI, mask); // 插入標志,只復制掩碼不為 0 的位置
    cv::imshow("Image", image);
    cv::waitKey(0);

    return 0;
}
# 編譯并執(zhí)行
# 若版本為 OpenCV4.x,則最后改為 opencv4
$ g++ logo.cpp -o test3 `pkg-config --cflags --libs opencv` 
$ ./test3

《OpenCV 計算機視覺編程攻略》學習筆記(一:圖像編程入門)

《OpenCV 計算機視覺編程攻略》學習筆記(一:圖像編程入門)文章來源地址http://www.zghlxwxcb.cn/news/detail-493267.html

到了這里,關于《OpenCV 計算機視覺編程攻略》學習筆記(一:圖像編程入門)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • python 機器視覺 車牌識別 - opencv 深度學習 機器學習 計算機競賽

    python 機器視覺 車牌識別 - opencv 深度學習 機器學習 計算機競賽

    ?? 優(yōu)質競賽項目系列,今天要分享的是 ?? 基于python 機器視覺 的車牌識別系統(tǒng) ??學長這里給一個題目綜合評分(每項滿分5分) 難度系數(shù):3分 工作量:3分 創(chuàng)新點:3分 ?? 更多資料, 項目分享: https://gitee.com/dancheng-senior/postgraduate 車牌識別其實是個經典的機器視覺任務了,

    2024年02月06日
    瀏覽(27)
  • 計算機競賽 python 機器視覺 車牌識別 - opencv 深度學習 機器學習

    計算機競賽 python 機器視覺 車牌識別 - opencv 深度學習 機器學習

    ?? 優(yōu)質競賽項目系列,今天要分享的是 ?? 基于python 機器視覺 的車牌識別系統(tǒng) ??學長這里給一個題目綜合評分(每項滿分5分) 難度系數(shù):3分 工作量:3分 創(chuàng)新點:3分 ?? 更多資料, 項目分享: https://gitee.com/dancheng-senior/postgraduate 車牌識別其實是個經典的機器視覺任務了,

    2024年02月12日
    瀏覽(34)
  • 計算機視覺OpenCv學習系列:第四部分、鍵盤+鼠標響應操作

    計算機視覺OpenCv學習系列:第四部分、鍵盤+鼠標響應操作

    鍵盤響應中有一個函數(shù)叫做 waitKey ,所有的獲取鍵盤鍵值都是通過waitKey函數(shù)實現(xiàn)的。 1.鍵盤響應事件 cv.waitKey( [, delay] ) -- retval delay如果沒有聲明或者delay=0,表示一直阻塞 delay大于0,表示阻塞指定毫秒數(shù) retval返回的對應鍵盤鍵值,注意:在不同的操作系統(tǒng)中可能會有差異! 典

    2024年02月09日
    瀏覽(31)
  • 計算機競賽 深度學習 機器視覺 人臉識別系統(tǒng) - opencv python

    計算機競賽 深度學習 機器視覺 人臉識別系統(tǒng) - opencv python

    ?? 優(yōu)質競賽項目系列,今天要分享的是 ?? 深度學習 機器視覺 人臉識別系統(tǒng) 該項目較為新穎,適合作為競賽課題方向,學長非常推薦! ??學長這里給一個題目綜合評分(每項滿分5分) 難度系數(shù):3分 工作量:3分 創(chuàng)新點:3分 ?? 更多資料, 項目分享: https://gitee.com/dancheng

    2024年02月07日
    瀏覽(103)
  • 【學習筆記】計算機視覺深度學習網絡模型

    【學習筆記】計算機視覺深度學習網絡模型

    這是本人學習計算機視覺CV領域深度學習模型的學習的一點點學習筆記,很多片子沒有完成,可以作為學習的參考~

    2024年04月10日
    瀏覽(40)
  • 計算機競賽 深度學習 opencv python 公式識別(圖像識別 機器視覺)

    計算機競賽 深度學習 opencv python 公式識別(圖像識別 機器視覺)

    ?? 優(yōu)質競賽項目系列,今天要分享的是 ?? 基于深度學習的數(shù)學公式識別算法實現(xiàn) 該項目較為新穎,適合作為競賽課題方向,學長非常推薦! ??學長這里給一個題目綜合評分(每項滿分5分) 難度系數(shù):3分 工作量:4分 創(chuàng)新點:4分 ?? 更多資料, 項目分享: https://gitee.com/d

    2024年02月07日
    瀏覽(19)
  • 多目標跟蹤算法 實時檢測 - opencv 深度學習 機器視覺 計算機競賽

    多目標跟蹤算法 實時檢測 - opencv 深度學習 機器視覺 計算機競賽

    ?? 優(yōu)質競賽項目系列,今天要分享的是 ?? 深度學習多目標跟蹤 實時檢測 該項目較為新穎,適合作為競賽課題方向,學長非常推薦! ??學長這里給一個題目綜合評分(每項滿分5分) 難度系數(shù):3分 工作量:3分 創(chuàng)新點:4分 ?? 更多資料, 項目分享: https://gitee.com/dancheng-sen

    2024年02月05日
    瀏覽(27)
  • 基于計算機視覺,深度學習、機器學習,OpenCV,圖像分割,目標檢測卷積神經網絡計算機畢業(yè)設計選題題目大全選題指導

    隨著深度學習、機器學習和神經網絡技術的快速發(fā)展,計算機視覺領域的應用變得越來越廣泛和有趣。本畢業(yè)設計旨在探索這一領域的前沿技術,將深度學習模型、神經網絡架構、OpenCV圖像處理工具,以及卷積神經網絡(CNN)的強大能力結合起來,以解決實際圖像處理問題。

    2024年02月08日
    瀏覽(100)
  • 實戰(zhàn)指南:使用OpenCV 4.0+Python進行機器學習與計算機視覺

    實戰(zhàn)指南:使用OpenCV 4.0+Python進行機器學習與計算機視覺

    ?? 個人網站:【辦公神器】【游戲大全】【神級源碼資源網】 ?? 前端學習課程:??【28個案例趣學前端】【400個JS面試題】 ?? 尋找學習交流、摸魚劃水的小伙伴,請點擊【摸魚學習交流群】 計算機視覺和機器學習的融合為我們帶來了前所未有的機會和挑戰(zhàn)。從智能助手到

    2024年02月13日
    瀏覽(38)
  • 計算機競賽 深度學習人體跌倒檢測 -yolo 機器視覺 opencv python

    計算機競賽 深度學習人體跌倒檢測 -yolo 機器視覺 opencv python

    ?? 優(yōu)質競賽項目系列,今天要分享的是 ?? **基于深度學習的人體跌倒檢測算法研究與實現(xiàn) ** 該項目較為新穎,適合作為競賽課題方向,學長非常推薦! ??學長這里給一個題目綜合評分(每項滿分5分) 難度系數(shù):3分 工作量:3分 創(chuàng)新點:5分 ?? 更多資料, 項目分享: https

    2024年02月08日
    瀏覽(105)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包