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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(二)寻找物体的凸包

發布時間:2023/11/27 生活经验 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(二)寻找物体的凸包 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

8.2 尋找物體的凸包

8.2.1 概念

1.給定二維平面上的點集,將最外層點連接起來構成的凸多邊形。
2.理解物體形狀或輪廓的一種比較有用的方法是計算一個物體的凸包,然后計算其凸缺陷(convexity defects)例如,圖中A-H區域是凸包的各個”缺陷”:
????????????????
3.函數:convexHull()函數
4.函數原型:

void convexHull(InputArray points,OutputArray hull,bool clockwise=false, bool returnPoints=true)

5.參數說明:
(1)輸入的二維點集,Mat類型或std::vector
(2)輸出參數,找到的凸包,返回的hull是points中點的索引
(3)操作方向標識符,為真時輸出凸包為順時針方向,否則逆時針
(4)操作標識符,默認true,標志為真時函數返回各凸包的各個點,否則返回凸包各點的指數,輸出數組是std:vector時此標志忽略

8.2.2 示例程序

1. 凸包檢測基礎

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main()
{//初始化變量和隨機值Mat image(600, 600, CV_8UC3);RNG& rng = theRNG();//循環,按下ESC退出程序,否則有鍵按下便一直更新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);}//檢測凸包vector<int>hull;convexHull(Mat(points), hull, true);//返回的hull是points中點的索引//繪制出隨機顏色的點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]];line(image, point0, point, Scalar(255,255,255), 2, LINE_AA);point0 = point;}//顯示效果圖imshow("凸包檢測示例", image);//按下ESC,程序退出key = (char)waitKey();if (key == 27) break;}return 0;
}

運行效果:

2.綜合示例

/*
效果:滑動條控制閾值g_nThresh,以改變g_thresholdImage_output,findContours以此參數為輸入,查找不同輪廓圖,從而得到不同凸包檢測效果圖
*/
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
using namespace cv;
using namespace std;
#define WINDOW_NAME1 "【原始圖】"
#define WINDOW_NAME2 "【效果圖】"
//全局變量
Mat g_srcImage, g_grayImage, g_thresholdImage_output, g_dstImage;
int g_nThresh = 80;
int g_nThresh_max = 255;
RNG g_rng(12345);
Mat srcImage_copy = g_srcImage.clone();
vector<vector<Point>>g_vContours;
vector<Vec4i>g_vHierarchy;
//全局函數
static void ShowHelpText();
static void on_ThreshChange(int, void*);
int main()
{//改變console字體顏色system("color 1F");ShowHelpText();//載入原圖g_srcImage = imread("girl.jpg", 1);if (!g_srcImage.data){printf("圖片載入失敗~!\n");return false;}//創建窗口namedWindow(WINDOW_NAME1, WINDOW_AUTOSIZE);namedWindow(WINDOW_NAME2, WINDOW_AUTOSIZE);imshow(WINDOW_NAME1, g_srcImage);//轉成灰度圖并模糊化降噪cvtColor(g_srcImage, g_grayImage, CV_BGR2GRAY);blur(g_grayImage, g_grayImage, Size(3, 3));//創建滾動條并初始化createTrackbar("閾值", WINDOW_NAME2, &g_nThresh, g_nThresh_max, on_ThreshChange);on_ThreshChange(0, 0);waitKey(0);return 0;
}
static void on_ThreshChange(int, void*)
{//對圖像進行二值化,控制閾值threshold(g_grayImage, g_thresholdImage_output, g_nThresh, 255, THRESH_BINARY);//查找輪廓findContours(g_thresholdImage_output, g_vContours, g_vHierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));//遍歷每個輪廓,尋找其凸包vector<vector<Point>>hull(g_vContours.size());for (int i = 0; i < g_vContours.size(); i++){convexHull(Mat(g_vContours[i]), hull[i], false);}//繪制輪廓及其凸包Mat g_dstImage = Mat::zeros(g_thresholdImage_output.size(), CV_8UC3);//或 for (int index = 0; index >= 0; index = g_vHierarchy[index][0])for (int index = 0; index < g_vContours.size(); index++){//或 Scalar color(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255));//任意值Scalar color(rand() & 255, rand() & 255, rand() & 255);drawContours(g_dstImage, g_vContours, index, color, 1, 8, vector<Vec4i>(), 0, Point());drawContours(g_dstImage, hull, index, color, 1, 8, vector<Vec4i>(), 0, Point());}//顯示效果圖imshow(WINDOW_NAME2, g_dstImage);
}
static void ShowHelpText()
{printf("\n\n\t歡迎來到【在圖形中尋找輪廓及其凸包】示例程序!\n\n");printf("\n\n\t操作說明:\n\n");printf("\t\t鍵盤任意鍵-退出程序\n\n");printf("\t\t滑動滾動條-改變閾值\n");
}

運行效果:

總結

以上是生活随笔為你收集整理的《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(二)寻找物体的凸包的全部內容,希望文章能夠幫你解決所遇到的問題。

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