日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

Opencv c++(图像处理)

發布時間:2023/12/20 c/c++ 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++(图像处理)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲黄色免费观看 | 亚洲自拍偷拍欧美 | www.com欧美 | 亚洲青春草 | 精品国产91久久久久久久妲己 | 色播综合网 | www夜插内射视频网站 | 免费看黄色一级大片 | 久久亚洲网 | 天天成人| 成人黄色短片 | 久久999| 日韩视频免费观看高清完整版 | 超碰狠狠干 | 97操操| 日本一区二区色 | 超碰在线98| 夜夜嗨视频 | av观看免费 | 国产亚洲精品久久久久婷婷瑜伽 | 爽爽影院免费观看 | 国产女人被狂躁到高潮小说 | 涩涩资源网| 免费观看国产精品 | 日韩中文在线播放 | 国产一区91 | 中文字幕亚洲视频 | 在线观看中文字幕视频 | 涩涩屋污| se94se欧美 | 日韩欧美亚洲国产精品字幕久久久 | 加勒比一区二区三区 | 日韩新片王网 | 春宵av| 亚洲91网 | 91久久 | 看片地址| 激情一区二区 | 国产亚洲精品久久久久久青梅 | 色蜜桃av| 欧美成人久久久 | 日韩成人区 | 亚洲av无码乱码在线观看性色 | 国产黑丝91 | 扒下小娇妻的内裤打屁股 | 国产男女猛烈无遮挡免费视频动漫 | 色xxxx| 好好热视频 | 熟女熟妇伦久久影院毛片一区二区 | 日韩二区在线 | 初音未来打屁股 | 高清av一区二区三区 | 欧美日一区二区三区 | 调教丰满的已婚少妇在线观看 | 亚洲欧洲精品一区二区三区 | 自由成熟xxxx色视频 | 精品乱人伦一区二区三区 | 在线看黄网站 | 亚洲综合另类 | 91蜜桃网站 | av导航网| 在线视频97 | 美女自拍偷拍 | 波多野结衣亚洲一区二区 | 中文字幕人妻一区二区三区 | av在线视 | 国产精品欧美亚洲 | 公侵犯人妻中文字慕一区二区 | 国产精品美女www爽爽爽视频 | 黄色日b片 | 国产五月天婷婷 | 色综合久久精品亚洲国产 | 香蕉福利视频 | 国产视频二区三区 | 桃色一区二区 | 成人午夜影院 | 日韩中文字幕免费视频 | 美女扒开内看个够网站 | 亚洲视频在线一区 | 久久综合色视频 | 禁网站在线观看免费视频 | 美女一级片| 日本一本一道 | 免费黄片毛片 | 色一情一区二区三区 | 99热这里只有精品5 国产精品伦子伦免费视频 精品一二三 | 欧美性猛交xxxx乱大交hd | 黄色毛毛片| 中文字幕亚洲精品在线观看 | 国产综合久久 | 日韩视频播放 | 爱的色放韩国电影 | 国产a网站 | av无码精品一区二区三区宅噜噜 | 久热国产视频 | 激情午夜av| 在线视频观看国产 | 香蕉网在线 | 九九热在线观看视频 |