C++?OpenCV中幾種基本的圖像處理方式
雖然單單要做車牌號識別的話不需要特別多種類的圖像處理,但是我們不能只是為了這么一個目標去學習,所以這次就講一些OpenCV里基本的圖像處理,大家以后可以根據需求使用不同的圖像處理。
一、圖像顯示
【打開Visual Studio】→【新建項目】→【Win32控制臺應用項目(修改名稱后點確定)】→【下一步】→【空項目(勾起來以后點擊確認)】→【解決方案資源管理器】→【源文件】→【新建項】→【添加】→【(修改名稱后點擊確定)】
(后面的程序都是以這個操作開頭的,而我為了方便所以就在一個源文件里進行修改了)
我這次的路徑是D:\University\New\Test2\Test2
#include<opencv2\opencv.hpp> using namespace cv; //包含cv命名空間 void main(){ Mat img = imread("1.jpg"); //載入圖片 imshow("【原始圖】", img); //顯示圖像 waitKey(0); //等待任意按鍵按下 }
此處的1.jpg是放在了上面那個路徑里面,出現(xiàn)的效果圖:
當然,其實也可以顯示不在該文件夾里的圖片,只需要將“1.jpg”改成你想要顯示的圖片所在的路徑即可,例如我在D盤存了個2.jpg,我想要顯示它,就只需將代碼改成Mat img=imread("D://2.jpg");就可以了。
為了和上次的有些區(qū)別,我們來稍微講一下代碼中的一些語句的含義。
1、OpenCV的命名空間
OpenCV中的C++類和函數(shù)都是定義在命名空間cv之內的,有兩種方法可以訪問:第一種,是在代碼開頭的適當位置加上using namespace cv;這句代碼,規(guī)定程序位于此命名空間之內;另外一種,是在使用OpenCV的每一個類和函數(shù)時,都加入cv::命名空間。不用講都知道,第二種方法十分的繁瑣,所以,推薦大家在代碼開頭的適當位置,加上using namespace cv;這句。
2、Mat類簡析
Mat類是用于保存圖像以及其他矩陣數(shù)據的數(shù)據結構,默認情況下其尺寸為0。我們也可以指定其初始尺寸,比如定義一個Mat類對象,就要寫cv::Mat pic(320,640,cv::Scalar(100));,Mat類是OpenCV里十分重要,內容有很多,我們這里需要用到的關于Mat的其實就是簡單的這樣一句代碼:Mat img=imread("1.jpg");,所以我就不在多講了。
3、圖像的載入:imread()函數(shù)
imread()函數(shù)是用于讀取文件中的圖片到OpenCV中??梢栽贠penCV官方文檔中查到它的原形,如下:
Mat imread(const string& filename, intflags=1);
第一個參數(shù),const string&類型的filename,填我們需要載入的圖片路徑名,在Windows操作系統(tǒng)下,OpenCV的imread函數(shù)支持如下類型的圖像載入。
第二個參數(shù),int類型的flags,為載入標識,他指定一個加載圖像的顏色類型【這個內容有些生澀難理解,故不多贅述】。
4、imshow()函數(shù)
imshow()函數(shù)用于在指定的窗口中顯示一幅圖像,函數(shù)原型如下。
void imshow(const string& winname, InputArray mat);
第一個參數(shù),const string&類型的winname,填需要顯示的窗口標識名稱。
第二個參數(shù),InputArray類型的mat,填需要顯示的圖像?!竞芏鄷r候,遇到函數(shù)原型中的InputArray/OutputArray類型,我們把它簡單地當做Mat類型即可。因為它的定義有些難理解,而且源代碼略顯冗長,所以不過多贅述】
二、圖像腐蝕和膨脹
腐蝕,即用圖像中的暗色部分“腐蝕”掉圖像中的高亮部分。代碼如下:
#include<opencv2\highgui\highgui.hpp> //OpenCV highgui模塊頭文件 #include<opencv2\imgproc\imgproc.hpp> //OpenCV 圖像處理頭文件 using namespace cv; //包含cv命名空間 int main(){ //載入圖片 Mat img = imread("1.jpg"); //顯示原圖 imshow("【原圖】腐蝕操作", img); //進行腐蝕操作 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); Mat dstimg; erode(img, dstimg, element); //顯示效果圖 imshow("【效果圖】腐蝕操作", dstimg); waitKey(0); return 0; }
程序首先依然是載入和顯示一幅圖像,然后定義一個Mat類型的變量來獲得getStructuringElement函數(shù)的返回值,而getStructuringElement函數(shù)的返回值為指定形狀和尺寸的結構元素(內核矩陣)。參數(shù)準備完畢,接著便可以調用erode函數(shù)進行圖像腐蝕操作,然后調用imshow函數(shù)進行顯示。
下面對getStructuringElement函數(shù)進行簡單的講述:
第一個參數(shù),內核的形狀(一般有下面三種:矩形:MORPH_RECT;交叉形:MORPH_CROSS;橢圓形:MORPH_ELLIPSE)
第二個參數(shù),內核的大?。ㄉ厦娴拇a,表示的就是15*15的正方形內核)
效果圖如下(原圖都和一中的原圖一樣,故不再顯示):
膨脹,和腐蝕相反,從圖像直觀來看,就是將圖像光亮部分放大,黑暗部分縮小。代碼如下:
#include<opencv2\highgui\highgui.hpp> //OpenCV highgui模塊頭文件 #include<opencv2\imgproc\imgproc.hpp> //OpenCV 圖像處理頭文件 using namespace cv; //包含cv命名空間 int main(){ //載入圖片 Mat img = imread("1.jpg"); //顯示原圖 imshow("【原圖】膨脹操作", img); //進行膨脹操作 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); Mat dstimg; dilate(img, dstimg, element); //顯示效果圖 imshow("【效果圖】膨脹操作", dstimg); waitKey(0); return 0; }
和腐蝕的代碼的區(qū)別就只在于調用的函數(shù)不同,膨脹調用的是dilate函數(shù)。
效果圖如下:
三、圖像模糊
模糊,對圖像進行均值濾波處理,然后就把圖像模糊了……代碼如下:
#include<opencv2\highgui\highgui.hpp> #include<opencv2\imgproc\imgproc.hpp> using namespace cv; int main(){ //載入原圖 Mat img = imread("1.jpg"); //顯示原圖 imshow("【原圖】均值濾波", img); //進行均值濾波操作 Mat dstimg; blur(img, dstimg, Size(7, 7)); //顯示效果圖 imshow("【效果圖】均值濾波", dstimg); waitKey(0); return 0; }
blur函數(shù)的第三個參數(shù)表示的是內核的大小,代碼中的意思是像素長寬均為7的一個內核。
效果圖如下:
四、canny邊緣檢測
這個操作會在我們最終要實現(xiàn)的汽車車牌識別中會出現(xiàn)。
載入圖像,并將其轉成灰度圖,再用blur函數(shù)進行圖像模糊以降噪,然后用canny函數(shù)進行邊緣檢測,最后進行顯示。代碼如下:
#include<opencv2\highgui\highgui.hpp> #include<opencv2\imgproc\imgproc.hpp> using namespace cv; int main(){ //載入原圖 Mat srcImage = imread("1.jpg"); //顯示原圖 imshow("【原圖】Canny邊緣檢測", srcImage); Mat dstImage, edge, grayImage; //【1】創(chuàng)建于src同類型和大小的矩陣dst dstImage.create(srcImage.size(), srcImage.type()); //【2】將原圖像轉換成灰度圖像 cvtColor(srcImage, grayImage, COLOR_BGR2GRAY); //【3】先使用3*3內核來降噪 blur(grayImage, edge, Size(3, 3)); //【4】運行Canny算子 Canny(edge, edge, 3, 9, 3); //顯示效果圖 imshow("【效果圖】Canny邊緣檢測", edge); waitKey(0); return 0; }
簡單講一下Canny函數(shù)各參數(shù)的意義:
第一個參數(shù):輸入,是灰度圖,就算是彩色圖也會處理成灰度圖(但是如果不先轉成灰度圖像并降噪的話會出現(xiàn)很多原本不存在的線條,大家可以自己嘗試一下)
第二個參數(shù):輸出的圖的位置,輸出的圖是二值圖。
第三四個參數(shù):是兩個閾值,上限和下限,如果一個像素的梯度大于上限,則被認為是邊緣像素,如果低于下限則被拋棄,如果介于兩者之間,只有當其與高于上限閾值的像素連接時才會被接受。
第五個參數(shù):表示模板的大小,如果是3,則表示3*3矩陣的大小。
效果圖如下:
到此這篇關于C++ OpenCV中幾種基本的圖像處理方式的文章就介紹到這了,更多相關C++ OpenCV圖像處理方式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
關于vs strcpy_s()和strcat_s()用法探究
這篇文章主要介紹了關于vs strcpy_s()strcat_s()用法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05C++實現(xiàn)圖像目標區(qū)裁剪ImageCropping
本文主要介紹了C++實現(xiàn)圖像目標區(qū)裁剪ImageCropping,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06