第一次在CSDN記錄自己的學習,如有不對的地方,還望大佬指正
1.1.環境搭建
下載OpenCV
官網:https://opencv.org
環境配置
x64/vc15/bin,復制該目錄的路徑加到你的環境變數中
vs2019 之后的版本都使用vc14
1.2 vs配置
一定要在 x64 下配置
專案屬性中修改 包含目錄為 build/include
修改庫目錄為 build/x64/vc15/lib
修改聯結器->輸入->附加依賴想 添加自己包內的lib
例如:opencv_world3411d.lib
實作原理
opencv_core 負責庫的核心功能
#include <opencv2/core.hpp>
opencv_imgproc 包含主要的影像處理函式
#include <opencv2/imgproc.hpp>
opencv_highgui 提供了讀寫影像和視頻的函式以及一些用戶互動函式
#include <opencv2/highgui.hpp>
測驗代碼
demo1.cpp
1.3.加載,修改,保存影像
加載影像(cv:imread)
修改影像(cv::cvtColor)
保存影像(cv::imwrite)
定義一個表示影像的變數,就是定義一個 Mat類 的物件
Mat image;
查看 image物件的 size 屬性:
cout << " This image is " << img.rows << " * " << img.cols << endl;
如何理解 rows 和 cols ?
例如:照片img的像素是400 * 200,即長為 400 像素 ,寬為 200 像素
則有 img.rows = 200; (行)
img.cols = 400; (列)
利用讀取函式,從檔案中讀取一張圖片
image = imread("D:/myfile/ME/test.png");
讀取完之后可以使用該圖片,但是需要檢查下圖片讀取是否正確,利用 empty 函式
if(image.empty())
{
cout << " the image is wrong"
}
注意的是,若沒有分配影像資料,empty函式回傳的是 true
接下來為了顯示圖片,我們需要先定義一個視窗,利用 highgui 中的 namedWindow 來定義視窗,用 imshow 來顯示影像
語法:imshow(“視窗名”,物件名)
namedWindow("opencv test");
imshow("opencv test",image);
我們將對影像進行一些處理,先來做一個簡單的水平處理
Mat result;
flip(image,result,1)
其中 flip 函式中的值,正數 表示水平,0 表示垂直,負數 表示水平和垂直
在另一個視窗展現結果
namedWindow("result")
imshow("result",result);
由于是控制臺視窗,會在 main 函式結束后關閉,我們需要添加一個函式,讓他等待,
waitkey(0);
我們可以用 highgui中的函式 把處理過的影像儲存在磁盤里
imwrite("output.bmp",result);
highgui 中有一批能幫助我們輕松顯示影像并對影像進行操作的函式,例如使用 imread 裝載函式的時候,可以通過設定將其轉為灰度影像
image = imread("D:/myfile/ME/test.png",IMREAD_GRAYSCALE);
這樣生成的影像由無符號位元組構成,在 OpenCV 中用常量 CV_8U 表示,即使是灰度影像,但是有時候在讀入的時候還是需要將其轉換成三通道彩色影像
image = imread("D:/myfile/ME/test.png",IMREAD_COLOR);
這樣創建的影像中,每個像素由3個位元組,OpenCV中用 CV_8UC3 表示,若輸入的是灰度影像,那么三個通道的值都是相等的
如果要在讀入影像的時候采用檔案本身的格式,只需要將第二個值設定為負數,可用 channels 方法檢查影像的通道數
cout << "This image is" << image.channels() << "channels(s)";
highgui 模塊中有大量處理影像的函式,其中有可以使程式對滑鼠或鍵盤事件做出相應,也可以在影像上繪制形狀或寫入文本
1.在影像上點擊
通過編程,你可以讓滑鼠在置于影像視窗上時運行特定的指令,要實作這個功能,需定義一 個合適的回呼函式,
回呼函式不會被顯式地呼叫,但是會在回應特定事件的時候被程式呼叫,
為了能被程式識別,回呼函式需要具有特定的簽名
void onm ouse( int event, int x, int y, int flags, void* param);
event 引數是個整數,表示觸發回呼函式的滑鼠事件的型別
x 和 y 是指事件發生時滑鼠的位置,用像素坐標表示
flags 表示事件發生時按下了滑鼠的哪個鍵
param 是指向任意物件的指標,作為附帶的引數發送給函式
可以用這個方法注冊回呼函式
setMouseCallback("Original Image",onMouse,reinterpret_cast<void*>(&image));
函式 onm ouse 與 Original Image 的影像視窗建立了關聯,同時把所顯示影像的地址作為附加引數傳給函式
只要用下面的代碼定義回呼函式 onm ouse, 每當遇到滑鼠點擊事件時,控制臺就會顯示對應像素的值
void onm ouse( int event, int x, int y, int flags, void* param) {
Mat *im= reinterpret_cast(param);
switch (event) { // 調度事件
case EVENT_LBUTTONDOWN: // 滑鼠左鍵按下事件
// 顯示像素值(x,y)
cout << "at (" << x << "," << y << ") value is: " << static_cast( im->at(cv::Point(x,y))) << std::endl;
break;
}
}
OpenCV 還提供了幾個用于在影像上繪制形狀和寫入文本的函式
例如:circle,ellipse,line 和 rectangle
circle(image,Point(115,110),65,0,3)
語法:circle(目標影像,中心點坐標,半徑,顏色,厚度)
也可以在影像上寫入文本
putText(image,"This is a dog.",Point(40,200),Font_HERSHEY_PLAIN,2.0,255,2);
語法:putText(image,文本,文本坐標,字體型別,字體大小,字體顏色,文本厚度)
這里出現了一個問題,無法顯示,發現顯示有先后關系,所以代碼順序應該為
namedWindow("opencv test");
putText(img, "This is a dog.", Point(40, 200),FONT_HERSHEY_PLAIN, 2.0, 255, 2);
circle(img, Point(115, 110), 65, 0, 3);
imshow("opencv test", img);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/297395.html
標籤:其他
上一篇:關鍵詞檢測任務調研(Keyword Spotting)(4)
下一篇:YOLOP 訓練+測驗+模型評估
