這個問題是誰問個人我已經不記得了,剛開始的時候他發了這張圖像給我,讓我給他看一下,我當時告訴他轉換一下色彩空間提取就好啦,後來我記得他在微信上有問了我一次,今天我整理文件看到這張圖又想起了,感受他問了我好幾回我都沒回復挺不意思的,可是我實在不知道他是誰了,微信上消息太多,早已經把他淹沒了,加之我記憶力退化嚴重,思來想去只好寫篇文章告訴他,我回答了!若是看完感受對你也有用,點在看支持便可!html
先看看他發個人圖像文件吧
在來講說他的需求:
找到途中所有青色的區域,檢測出來,繪製中心點!他用霍夫變換,結果直接翻車了,緣由其實我很理解,這個圖有不少梯度干擾,噪聲干擾,用了確定翻車!而後他就問我怎麼辦?ios
直接轉換到HSV色彩空間,獲得以下結果:微信
而後我選擇5x5的開操做,完成以後獲得ide
使用OpenCV輪廓發現,對輪廓擬合圓,求的圓心座標獲得輸出結果以下:
怎麼樣,效果好嗎?學習
上述步驟的代碼演示,主要分爲以下步驟
1.加載圖像並轉換到HSV色彩空間,獲得mask
2.根據mask二值圖像,進行形體學處理
3.使用輪廓發現,找到全部最外層輪廓
4.對輪廓進行圓擬合,獲得圓心與半徑,而後繪製
代碼以下:spa
1#include <opencv2/opencv.hpp> 2#include <iostream> 3 4using namespace cv; 5using namespace std; 6 7int main(int argc, char** argv) { 8 Mat image = imread("D:/images/zsxq/zsxq_20.png"); 9 imshow("input", image); 10 11 // 色彩空間轉換 12 Mat hsv, mask; 13 cvtColor(image, hsv, COLOR_BGR2HSV); 14 inRange(hsv, Scalar(40,43, 46), Scalar(50, 255, 255), mask); 15 imshow("mask", mask); 16 imwrite("D:/mask.png", mask); 17 18 // 形態學開操做 19 Mat se = getStructuringElement(MORPH_RECT, Size(5, 5), Point(-1, -1)); 20 morphologyEx(mask, mask, MORPH_OPEN, se); 21 imshow("binary", mask); 22 imwrite("D:/binary.png", mask); 23 24 // 輪廓發現 25 vector<vector<Point>> contours; 26 vector<Vec4i> hiearchy; 27 findContours(mask, contours, hiearchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); 28 for (int i = 0; i < contours.size(); i++) { 29 // 圓擬合 30 RotatedRect rrt = fitEllipse(contours[i]); 31 Point ct = rrt.center; 32 int h = rrt.size.height; 33 int w = rrt.size.width; 34 printf("height : %d, width : %d \n", h, w); 35 circle(image, ct, 2, Scalar(0, 0, 255), 2, 8); 36 circle(image, ct, (h + w) / 4, Scalar(255, 0, 0), 2, 8, 0); 37 } 38 39 // 顯示輸出 40 imshow("result", image); 41 imwrite("D:/result.png", image); 42 waitKey(0); 43 return 0; 44}
但願他會看到,若是看到給我留言知道一下!最後跟你們道歉一下,代碼超過20行了@_@!!!!code
學習OpenCV4圖像處理與二值分析教程,
你也能夠跟我同樣快速解決此類問題
OpenCV4 圖像處理與視頻分析實戰教程視頻