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方法

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378627.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378627.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378627.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

EF Code First 簡單的示例

一對多&#xff1a; public class Category {public Category(){Id GuidComb.GenerateComb();}public Guid Id { get; set; }public string Name { get; set; }public string Description { get; set; }public virtual IList<Topic> Topics { get; set; } }public class…

線程同步 - 整理

線程同步機制為線程協同工作而設計&#xff0c;windows系統中有多種機制可以用于線程同步&#xff0c;最常用的有下面幾種&#xff1a; 互斥對象(Mutex)時間對象(Event)信號量(Semaphore)臨界區(critical section)可等待計時器(waitable Timer)同步過程中兩個重要的概念是同步對…

智能車復工日記【N】:圖像處理——環島debug記錄(持續更新)

博主聯系方式: QQ:1540984562 QQ交流群:892023501 群里會有往屆的smarters和電賽選手,群里也會不時分享一些有用的資料,有問題可以在群里多問問。 Debug記錄 代碼以及思路整理:系列文章4.10號更新5.4號更新5.5號更新代碼以及思路整理: 【智能車Code review】——環島的判…

java接口并發衡量_java 后端設計高并發接口總結

如何設置高并發接口一、并發隊列的選擇二、請求接口的合理設計三、高并發下的數據安全3.1 超發的原因3.2 悲觀鎖思路3.3 FIFO隊列思路3.4 樂觀鎖思路一、并發隊列的選擇Java的并發包提供了三個常用的并發隊列實現&#xff0c;分別是&#xff1a;ArrayBlockingQueue、Concurrent…

兩倍---C++

【問題描述】給定n個不同的正整數&#xff0c;你的任務是計算這些數里面有多少個數對滿足&#xff1a;數對中一個數是另一個數的兩倍&#xff0c;比如給定1 4 3 2 9 7 18 22&#xff0c;得到的答案是3&#xff0c;因為2是1的兩倍&#xff0c;4是2的兩倍&#xff0c;18是9的兩倍…

java bitset_Java BitSet cardinality()方法與示例

java bitsetBitSet類cardinality()方法 (BitSet Class cardinality() method) cardinality() method is available in java.util package. cardinality()方法在java.util包中可用。 cardinality() method is used to return the cardinality (i.e. the number of bits is set t…

LeetCode: Merge k Sorted Lists

自己寫的太復雜了&#xff0c;一開始想的是給開始的lists頭們排序&#xff0c;然后從這個序列的第一個抽出來&#xff0c;然后再重新用二分法進行排序&#xff0c;不過這個方法large超時了&#xff0c;看了網上的發現還是用很土地方法用一個for循環從前兩個開始merge到最后&…

JAVA 取得當前目錄的路徑

在寫java程序時不可避免要獲取文件的路徑...總結一下,遺漏的隨時補上 1.可以在servlet的init方法里 String path getServletContext().getRealPath("/"); 這將獲取web項目的全路徑 例如 :E:/eclipseM9/workspace/tree/ tree是我web項目的根目錄 2.你也可以隨時在任意…

golang mysql curd_Go 語言操作 MySQL 之 CURD 操作

本文轉載于SegmentFault社區作者&#xff1a;Meng小羽MySQL 是目前開發中最常見的關系型數據庫&#xff0c;使用 Go 語言進行操控數據庫需要使用 Go 自帶database/sql和驅動go-sql-driver/mysql來實現。創建好 Go 項目&#xff0c;需要引用驅動依賴&#xff1a;go get -u githu…

02.1-元素定位(find)

常用的一些方法 一、導包 from selenium import webdriver二、打開火狐&#xff08;空白頁&#xff09; b webdriver.Firefox()三、跳轉到指定的網站 b.get(https://www.baidu.com/)四、將瀏覽器頁面最大化 b.maximize_window()五、通過F12可查看當前的貼吧為超鏈接形式 …

快速傅里葉變換(FFT)——按時間抽取DIT的基

目錄【1】前言1、DIF計算量2、利用性質改善【2】公式推導1、N 到 2*N/2a、分解原序列b、分解后的DFT變換c、一系列化簡操作之后d、蝶形信號流e、計算量總結2、N/2 到 2*N/4a、分解X2(k)序列b、蝶形信號流&#xff08;2列&#xff09;3、N/4 到 2*N/8a、蝶形信號流&#xff08;3…

Python字符串| 帶示例的format()方法

String.format()方法 (String.format() Method) format() method is used to format the string (in other words - we can say to achieve the functionality like printf() in C language). format()方法用于格式化字符串(換句話說&#xff0c;我們可以說實現了C語言中類似于…

PLSQL Developer使用技巧

1、PL/SQL Developer記住登陸密碼在使用PL/SQL Developer時&#xff0c;為了工作方便希望PL/SQL Developer記住登錄Oracle的用戶名和密碼&#xff1b;設置方法&#xff1a;PL/SQL Developer 7.1.2 ->tools->Preferences->Oracle->Logon History &#xff0c; “St…

3月份的總結

租房子找了個黑中介&#xff0c;各種扣錢&#xff0c;合租的違約了&#xff0c;押金不要了直接一走了之&#xff0c;水費我們承擔&#xff0c;中介這會兒又把責任推得一干二凈&#xff0c;還耍小聰明&#xff0c;非說我是兩個人住的&#xff0c;各種費用要交兩份。。。我一時氣…

快速傅里葉變換(FFT)——按頻率抽取DIF的基

目錄【1】回顧DIT【2】算法原理【3】運算特點【1】回顧DIT https://blog.csdn.net/qq_42604176/article/details/105559756 【2】算法原理 設序列點數&#xff1a;N2^M,M為正整數。將輸入序列按照前一半、后一半分開。&#xff08;并非按照奇偶分&#xff09; 由于&#xf…

02.2-元素定位(XPath)

XML路徑語言用來確定XML文檔中某部分位置的語言XPath用于在XML文檔中通過元素和屬性進行導航XPath遵守W3C標準XPath節點類型&#xff1a; 元素、屬性、文本、命名空間、指令處理、注釋、文檔 通過路徑表達式從XML文檔中選取節點或節點設置 表達式結果說明/xxx選取根節點xxx/xx…

android ImageView 之 android:scaleTye=

原文&#xff1a;http://juliaailse.iteye.com/blog/1409317 1、scaleType“matrix” 是保持原圖大小、從左上角的點開始&#xff0c;以矩陣形式繪圖。 2、scaleType“fitXY” 是將原圖進行橫方向&#xff08;即XY方向&#xff09;的拉伸后繪制的。 3、scaleType“fitStart…

acquire方法_Python鎖類| 帶有示例的acquire()方法

acquire方法Python Lock.acquire()方法 (Python Lock.acquire() Method) acquire() is an inbuilt method of the Lock class of the threading module in Python. acquisition()是Python中線程模塊的Lock類的內置方法。 This method is used to acquire a lock, either block…

VSS2008 安裝silverlight3.0步驟

需要的Q我359273753 我是新手不知道在哪里上傳附件 汗一個轉載于:https://www.cnblogs.com/ganler1988/archive/2011/03/17/1987367.html

php字符串對象,PHP字符串到對象名稱

好的我有一個字符串……$a_string "Product";我想在調用這樣的對象時使用這個字符串&#xff1a;$this->$a_string->some_function();狄更斯如何動態調用該對象&#xff1f;(不要以為我在PHP 5心中)解決方法:所以你要使用的代碼是&#xff1a;$a_string &quo…