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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Opencv——查找并绘制凸包、凸包与轮廓的关系

發布時間:2023/12/1 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Opencv——查找并绘制凸包、凸包与轮廓的关系 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

定義

給定二維平面上的點集,凸包就是將最外層的點連接起來構成的凸多邊型。
理解物體形狀或輪廓的一 種比較有用的方法便是計算一個物體的凸包,然后計算其凸缺陷(convexity defects)。

檢測凸包

opencv自帶函數:convexHull()

參數解釋:

示例1:檢測隨機點群的凸包(只有一個凸包)

代碼以及注釋:

#include <opencv2/opencv.hpp> #include <iostream> #include "windows.h" #include <stdio.h> #include <time.h>using namespace cv; using namespace std;//===========================凸包檢測基礎==================== //先隨機生成3~103個坐標值隨機的彩色點,然后利用convexHull,對鏈接起來的圖形求凸包 int main() {Mat image(600, 600, CV_8UC3);//RNG& rng = theRNG(); //返回一個當前線程的隨機數生成器 RNG類可以產生多種類型的隨機數,故使用時需要指定是哪種類型的RNG rng((unsigned)time(NULL)); //這樣每次重新運行會產生不一樣的隨機數while (1){//參數初始化char key;int count = (unsigned)rng % 100 + 3; //隨機生成點的數量vector<Point> points; //點值//隨機生成點坐標for (int i = 0;i < count;i++){Point point;point.x = rng.uniform(image.cols / 4, image.cols * 3 / 4);point.y = rng.uniform(image.rows / 4, image.rows * 3 / 4);points.push_back(point); //將此時生成的點數據送入 points數組的最后一個}//檢測凸包(這里認為凸包只有一個)vector<int> hull; //存儲一個凸包的邊的一維數組 convexHull(Mat(points),hull,true);//輸入二維點集,輸出找到的凸包//繪制出隨機顏色的點image = Scalar::all(0); //背景for (int i = 0;i < count;i++){circle(image,points[i],3,Scalar(rng.uniform(0,255), rng.uniform(0, 255), rng.uniform(0, 255)),FILLED,LINE_AA);}//準備參數int hullcount = (int)hull.size(); //凸包的邊數(因為只有一個凸包,而凸包是由邊構成的序列,所以返回序列長度,應該返回的是邊的個數)Point point0 = points[hull[hullcount - 1]]; //連接凸包邊的坐標點 最后一條邊的坐標點//繪制凸包的邊for (int i = 0;i < hullcount;i++){Point point = points[hull[i]]; //points[hull[i]]表示構成凸包邊的某點(因為凸包是一個點集合最外面的點連接起來的區域)line(image, point0, point, Scalar(255, 255, 255), 2, LINE_AA);point0 = point;}//顯示效果圖imshow("凸包檢測示例",image);//按下ESC程序退出//key = (char)waitKey();//if (key == 27) break;waitKey(1000); //每秒顯示一次}return 0; }

演示效果:

示例2:動態檢測并繪制輪廓和凸包(一個輪廓對應一個凸包)

//===========================動態檢測繪制圖形的輪廓和凸包====================//=================全局變量聲明================= Mat g_srcImage; Mat g_grayImage; int g_nThresh = 50; int g_nThresh_max = 255; RNG g_rng(12345); Mat srcImage_copy = g_srcImage.clone(); Mat g_thresholdMat_output; vector<vector<Point>> g_vContours; vector<Vec4i> g_vHierarchy;//=============全局函數聲明=============== void on_ThreshChange(int,void*); int main() {// Read image 讀取圖像SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN); //字體為綠色//載入原圖g_srcImage = imread("D:\\opencv_picture_test\\lena.jpg",1);//Mat srcImage = imread("D:\\opencv_picture_test\\形態學操作\\孔洞.png", 0); //讀取灰度圖//轉換成灰度并且模糊化降噪cvtColor(g_srcImage, g_grayImage, COLOR_BGR2GRAY);blur(g_grayImage, g_grayImage, Size(3, 3));//創建窗口namedWindow("原始圖窗口", WINDOW_AUTOSIZE);imshow("原始圖窗口", g_srcImage);//創建滑動條并初始化createTrackbar("閾值", "原始圖窗口", &g_nThresh,g_nThresh_max, on_ThreshChange);on_ThreshChange(0,0);waitKey(0);return 0; } void on_ThreshChange(int, void*) {//用Canny算子檢測邊緣Canny(g_grayImage, g_thresholdMat_output, g_nThresh, g_nThresh * 2, 3);//尋找輪廓.findContours(g_thresholdMat_output, g_vContours, g_vHierarchy,RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));//遍歷每個輪廓,尋找其凸包vector<vector<Point> > hull( g_vContours.size()); //輪廓、凸包、點,構成三維數組 凸包的數組的大小等于輪廓的大小for (unsigned int i = 0;i<g_vContours.size();i++){convexHull(Mat (g_vContours[i]), hull[i],false); //在輪廓數組中尋找凸包,存入對應的hull中}//繪出輪廓及其凸包Mat drawing = Mat::zeros(g_thresholdMat_output.size(), CV_8UC3);for (int i = 0; i < g_vContours.size(); i++){Scalar color = Scalar(g_rng.uniform(0, 255),g_rng.uniform(0, 255), g_rng.uniform(0, 255));//任意值//繪制輪廓drawContours(drawing, g_vContours, i, color, 1, 8, g_vHierarchy,0, Point());//繪制凸包drawContours(drawing, hull, i, color, 1, 8, g_vHierarchy,0, Point());}//顯示效果圖imshow("效果圖",drawing); }

演示效果:
1、僅繪制凸包:

2、僅繪制輪廓:

3、既繪制輪廓也繪制凸包:

更加凸顯出輪廓與凸包的關系。
總結:
學到的凸包知識點:檢測并繪制凸包;輪廓、凸包、凸包連接點的結構關系。
學到的c++語法知識點:隨機數生成器RNG的用法;vector的push_back()操作。

參考鏈接:
C++RNG類與毛星云尋找凸包例程的理解
C++ push方法與push_back方法

總結

以上是生活随笔為你收集整理的Opencv——查找并绘制凸包、凸包与轮廓的关系的全部內容,希望文章能夠幫你解決所遇到的問題。

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