Opencv c++(图像处理)
目錄
一、圖像讀取與顯示
二、圖像預處理
高斯模糊的原理與算法
Canny邊緣檢測
?三、圖像裁剪
?四、繪制形狀和添加文本
?五、透視變換
?六、顏色檢測
七、形狀檢測和輪廓檢測
?八、人臉識別
一、圖像讀取與顯示
#include<opencv2/imgcodecs.hpp> #include<opencv2/highgui.hpp> #include<opencv2/imgproc.hpp> #include<iostream>using namespace cv; using namespace std;int main() {string path = "Resources/lambo.png";//圖片的路徑名Mat img = imread(path);//將圖片加載后賦值到圖像變量img中//if (path.empty()) { cout << "file not loaded" << endl; }//檢查文件是否打開 沒打開時執行打印語句//namedWindow("Image", WINDOW_FREERATIO);//創建一個名為Image的可調節的窗口imshow("Image", img);//創建一個窗口來顯示圖像imgwaitKey(0);//不斷刷新圖像return 0; }- waitKey()函數的功能是不斷刷新圖像,頻率為delay,單位是ms。
- delay為0時,則會一直顯示這一幀。
- delay不為0時,則在顯示完一幀圖像后程序等待“delay"ms再顯示下一幀圖像。
二、圖像預處理
#include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream>using namespace cv; using namespace std;void main() {string path = "Resources/test.png";Mat img = imread(path);Mat imgGray,imgBlur,imgCanny,imgDil,imgErode;//將照片轉換為灰度cvtColor(img, imgGray, COLOR_BGR2GRAY);//高斯模糊GaussianBlur(imgGray, imgBlur, Size(3, 3), 3, 0);//Canny邊緣檢測器 一般在使用Canny邊緣檢測器之前會做一些模糊處理Canny(imgBlur, imgCanny, 25, 75);//創建一個可以使用膨脹的內核Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));//圖像膨脹dilate(imgCanny, imgDil, kernel);//圖像侵蝕erode(imgDil, imgErode, kernel);//結果呈現imshow("Image", img);imshow("Image Gray", imgGray);imshow("Image Blur", imgBlur);imshow("Image Canny", imgCanny);imshow("Image Dilation", imgDil);imshow("Image Erode", imgErode);waitKey(0); }高斯模糊的原理與算法
第一個參數是要進行高斯模糊處理的圖像;第二個參數是處理后輸出的圖像;第三個參數是高斯內核大小,其中第一個值是寬,第二個值是高,兩個值可以不相同但必須是正奇數;第四和第五個參數分別是高斯核函數在X方向和y方向上的標準偏差,如果y是0,則函數會自動將y上的值設置為與x相同,如果x和y都是0,這兩個值將由高斯內核的兩個值計算而來。
?
Canny邊緣檢測
Canny(imgBlur, imgCanny, 25, 75);第3和第4個參數分別代表底閾值和高閾值,其中底閾值常取高閾值的1/2或1/3
//創建一個可以使用膨脹的內核Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));//圖像膨脹dilate(imgCanny, imgDil, kernel);//圖像侵蝕erode(imgDil, imgErode, kernel);?
?三、圖像裁剪
#include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream>using namespace cv; using namespace std;void main() {string path = "Resources/test.png";Mat img = imread(path);Mat imgResize,imgCrop;//調整圖像大小//cout << img.size() << endl;//查看原圖像的大小//resize(img, imgResize, Size(640, 480));//按自定義的寬度與高度縮放resize(img, imgResize, Size(),0.5,0.5);//按比例縮放//圖像裁剪Rect roi(200, 100, 300, 300);//前面兩個參數為距左上原點的x方向與y方向的距離,后兩個參數為延伸的x,y長度imgCrop = img(roi);imshow("Image", img);imshow("Image Resize", imgResize);imshow("Image Crop", imgCrop);waitKey(0);}?四、繪制形狀和添加文本
#include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream>using namespace cv; using namespace std; //繪制形狀和添加文本 void main() {//創建空白圖像Mat img(512, 512, CV_8UC3, Scalar(255, 255, 255));//繪制圓形//circle(img, Point(256, 256), 155, Scalar(0, 69, 255),10);circle(img, Point(256, 256), 155, Scalar(0, 69, 255),FILLED);//函數參數分別是 輸出到圖像img,圓心,半徑,顏色,厚度(FILLED 表示填滿)//繪制矩形rectangle(img, Point(130, 226), Point(382, 286), Scalar(255, 255, 255), FILLED);//函數參數分別是 輸出到圖像img,矩形左上角頂點坐標,右下角頂點坐標,顏色,厚度//繪制線段line(img, Point(130, 296), Point(382, 296), Scalar(255, 255, 255), 2);//函數參數分別是 輸出到圖像img,兩個端點坐標,顏色,厚度//添加文本putText(img, "Murtaza's Workshop", Point(137, 262), FONT_HERSHEY_DUPLEX, 0.75, Scalar(0, 69, 255), 2);//函數參數分別是 輸出到圖像img,文本內容,起點,字體,大小,顏色,厚度imshow("Image", img);waitKey(0); }?五、透視變換
#include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream>using namespace cv; using namespace std;float w = 250, h = 350; Mat matrix, imgWarp; // 透視變換 void main() {string path = "Resources/cards.jpg";Mat img = imread(path);Point2f src[4] = { {529,142},{771,190},{405,395},{674,457} };Point2f dst[4] = { {0.0f,0.0f},{w,0.0f},{0.0f,h},{w,h} };matrix = getPerspectiveTransform(src, dst);//獲取透視變換矩陣//src為源圖像四邊形頂點坐標,dst為目標圖像對應的四邊形頂點坐標warpPerspective(img, imgWarp, matrix, Point(w, h));//參數分別為 輸入圖像,輸出圖像,透視變換矩陣,圖像大小for (int i = 0; i < 4; i++){circle(img, src[i], 10, Scalar(0, 0, 255), FILLED);}//在原圖像中標記目標頂點imshow("Image", img);imshow("Image Warp", imgWarp);waitKey(0); }?六、顏色檢測
【OpenCV】HSV顏色識別-HSV基本顏色分量范圍_Taily老段的專欄-CSDN博客_hsv
色彩空間轉換函數-cvtColor
#include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream>using namespace cv; using namespace std;Mat imgHSV,mask; int hmin = 0, smin = 0, vmin = 0; int hmax =179, smax = 255, vmax = 255;void main() {string path = "Resources/shapes.png";Mat img = imread(path);cvtColor(img, imgHSV, COLOR_BGR2HSV);//HSV顏色空間 H(色調):0~180 S(飽和度):0~255 V(亮度):0~255namedWindow("Trackbars", (640, 200));//創建一個名為Trackbars的窗口,大小為640*200createTrackbar("Hue Min", "Trackbars", &hmin, 179);createTrackbar("Hue Max", "Trackbars", &hmax, 179);createTrackbar("Sat Min", "Trackbars", &smin, 255);createTrackbar("Sat Max", "Trackbars", &smax, 255);createTrackbar("Val Min", "Trackbars", &vmin, 255);createTrackbar("Val Max", "Trackbars", &vmax, 255);//createTrackbar函數是創建軌跡條,//4個參數分別是 軌跡條名字,輸出的窗口,一個指向整數的指針來表示當前的值,可到達的最大值while (true){//檢測我們所要的顏色 設置一個遮罩 在范圍內的顏色Scalar lower(hmin, smin, vmin);//HSV范圍最低值Scalar upper(hmax, smax, vmax);//HSV范圍最高值inRange(imgHSV, lower, upper, mask);//輸入,低值,高值,輸出 //inRange是將在閾值區間內的像素值設置為白色(255),而不在閾值區間內的像素值設置為黑色(0)imshow("Image", img);imshow("Image HSV", imgHSV);imshow("Image Mask", mask);waitKey(1);} }七、形狀檢測和輪廓檢測
#include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream>using namespace cv; using namespace std;Mat imgGray, imgBlur, imgCanny, imgDil, imgErode; //定義一個輪廓處理函數 void getContours(Mat imgDil,Mat img) {vector<vector<Point>> contours;//{ {Point(20,30),Point(50,60)},{}, {}}vector<Vec4i>hierarchy;//vector里放置了四個int類型的變量findContours(imgDil, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);//drawContours(img, contours, -1, Scalar(255, 0, 255), 2);vector<vector<Point>>conPoly(contours.size());vector<Rect> boundRect(contours.size());for (int i = 0; i < contours.size(); i++){int area = contourArea(contours[i]);cout << area << endl;//需要正確過濾的面積(過濾噪點)string objectType;//判斷形狀if (area>1000){float peri = arcLength(contours[i], true);approxPolyDP(contours[i], conPoly[i], 0.02 * peri, true);//找到近似值cout << conPoly[i].size() << endl;boundRect[i] = boundingRect(conPoly[i]);//邊界矩形int objCor = (int)conPoly[i].size();if (objCor == 3) { objectType = "Tri"; }if (objCor == 4) { float aspRatio = (float)boundRect[i].width / (float)boundRect[i].height;cout << aspRatio << endl;if (aspRatio > 0.95 && aspRatio < 1.05) { objectType = "Square"; }else { objectType = "Rect"; }}if (objCor > 4) { objectType = "Circle"; }drawContours(img, conPoly, i, Scalar(255, 0, 255), 2);//描繪計數輪廓rectangle(img, boundRect[i].tl(), boundRect[i].br(), Scalar(0, 255, 0), 5);//繪制邊界矩形//打印圖形的名字putText(img, objectType, { boundRect[i].x,boundRect[i].y - 5 }, FONT_HERSHEY_PLAIN, 1, Scalar(0, 69, 255), 2);}} }void main() {string path = "Resources/shapes.png";Mat img = imread(path);//圖像的預處理//1.將照片轉換為灰度cvtColor(img, imgGray, COLOR_BGR2GRAY);//2.高斯模糊GaussianBlur(imgGray, imgBlur, Size(3, 3), 3, 0);//3.Canny邊緣檢測器Canny(imgBlur, imgCanny, 25, 75);//4.創建一個可以使用膨脹的內核Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));//5.圖像膨脹dilate(imgCanny, imgDil, kernel);getContours(imgDil,img);imshow("Image", img);/*imshow("Image Gray", imgGray);imshow("Image Blur", imgBlur);imshow("Image Canny", imgCanny);imshow("Image Dilation", imgDil);*/waitKey(0); }參考:
opencv 常用的數據類型(vector、contours的解釋)_one-rabbit的博客-CSDN博客_contours的數據類型為
findContours函數參數詳解_牧野的博客-CSDN博客_findcontours函數
?八、人臉識別
#include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/objdetect.hpp> #include <iostream>using namespace cv; using namespace std;void main() {string path = "Resources/test.png";Mat img = imread(path);CascadeClassifier faceCascade;//創建級聯分類器//載入訓練模型faceCascade.load("Resources/haarcascade_frontalface_default.xml");if(faceCascade.empty()){cout<<"XML file not loaded"<<endl; }//檢查文件是否打開 沒打開時執行打印語句vector<Rect>faces;//創建人臉存放的vectorfaceCascade.detectMultiScale(img, faces, 1.1, 10); //detectMultiScale函數可以檢測出圖片中所有的人臉,并用vector保存各個人臉的坐標、大小//在原圖像中畫出人臉矩形邊框for (int i = 0; i < faces.size(); i++){rectangle(img, faces[i].tl(),faces[i].br(), Scalar(255, 0, 255), 3);}imshow("Image", img);waitKey(0); }參考:
openCV 中 cv::Rect 矩形類用法_sinat_38102206的博客-CSDN博客_cv rect
OpenCV detectMultiScale() 函數參數介紹_zhuyue_66-CSDN博客_detectmultiscale函數參數含義
?結果展示:
學習來源:4h上手C++版Opencv_嗶哩嗶哩_bilibili
總結
以上是生活随笔為你收集整理的Opencv c++(图像处理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CleanMyMacX4.11.3最新版
- 下一篇: 与亲哥决裂20年,董明珠被踢出族谱:帮你