Opencv提取連通區(qū)域輪廓的方法
本文實(shí)例為大家分享了Opencv提取連通區(qū)域輪廓的具體代碼,供大家參考,具體內(nèi)容如下
在進(jìn)行圖像分割后,可能需要對(duì)感興趣的目標(biāo)區(qū)域進(jìn)行提取,比較常用的方法是計(jì)算輪廓。
通過(guò)輪廓可以獲得目標(biāo)的一些信息:
(1)目標(biāo)位置
(2)目標(biāo)大小(即面積)
(3)目標(biāo)形狀(輪廓矩)
當(dāng)然,輪廓不一定代表希望目標(biāo)區(qū)域,閾值分割時(shí)可能造成一部分信息丟失,因此可以計(jì)算輪廓的質(zhì)心坐標(biāo),再進(jìn)行漫水填充。
程序中有尋找質(zhì)心+填充,但效果不好,因此就不放填充后的圖了。

實(shí)驗(yàn)結(jié)果:
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdio.h>
using namespace cv;
using namespace std;
vector<vector<Point> > contours; //輪廓數(shù)組
vector<Point2d> centers; //輪廓質(zhì)心坐標(biāo)
vector<vector<Point> >::iterator itr; //輪廓迭代器
vector<Point2d>::iterator itrc; //質(zhì)心坐標(biāo)迭代器
vector<vector<Point> > con; //當(dāng)前輪廓
int main()
{
double area;
double minarea = 100;
double maxarea = 0;
Moments mom; // 輪廓矩
Mat image,gray,edge,dst;
namedWindow("origin");
namedWindow("connected_region");
image = imread("view.jpg");
cvtColor(image, gray, COLOR_BGR2GRAY);
blur(gray, edge, Size(3,3)); //模糊去噪
threshold(edge,edge,200,255,THRESH_BINARY); //二值化處理
/*尋找輪廓*/
findContours( edge, contours,
CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE );
itr = contours.begin(); //使用迭代器去除噪聲輪廓
while(itr!=contours.end())
{
area = contourArea(*itr);
if(area<minarea)
{
itr = contours.erase(itr); //itr一旦erase,需要重新賦值
}
else
{
itr++;
}
if (area>maxarea)
{
maxarea = area;
}
}
dst = Mat::zeros(image.rows,image.cols,CV_8UC3);
/*繪制連通區(qū)域輪廓,計(jì)算質(zhì)心坐標(biāo)*/
Point2d center;
itr = contours.begin();
while(itr!=contours.end())
{
area = contourArea(*itr);
con.push_back(*itr);
if(area==maxarea)
drawContours(dst,con,-1,Scalar(0,0,255),2); //最大面積紅色繪制
else
drawContours(dst,con,-1,Scalar(255,0,0),2); //其它面積藍(lán)色繪制
con.pop_back();
//計(jì)算質(zhì)心
mom = moments(*itr);
center.x = (int)(mom.m10/mom.m00);
center.y = (int)(mom.m01/mom.m00);
centers.push_back(center);
itr++;
}
imshow("origin",image);
imshow("connected_region",dst);
waitKey(0);
/*漫水填充連通區(qū)域*/
Point2d seed;
int new_scalar = 0;
int loDiff = 8, upDiff = 8;
int connectivity = 4;
itrc = centers.begin();
while(itrc!=centers.end())
{
seed = *itrc;
floodFill(image,seed,Scalar::all(new_scalar),NULL,
Scalar::all(loDiff),Scalar::all(upDiff),connectivity);
itrc++;
}
waitKey(0);
return 0 ;
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語(yǔ)言基于EasyX庫(kù)實(shí)現(xiàn)有顏色彈跳小球
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言基于EasyX庫(kù)實(shí)現(xiàn)有顏色彈跳小球,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Qt實(shí)現(xiàn)編輯數(shù)據(jù)庫(kù)數(shù)據(jù)的方法詳解
這篇文章主要為大家詳細(xì)介紹了Qt是如何實(shí)現(xiàn)編輯數(shù)據(jù)庫(kù)數(shù)據(jù)的,文中的示例代碼簡(jiǎn)潔易懂,對(duì)我們深入了解QT有一定的幫助,感興趣的小伙伴可以了解一下2023-02-02
C語(yǔ)言實(shí)例梳理講解常用關(guān)鍵字的用法
關(guān)鍵字是C語(yǔ)言非常重要的一部分,熟練的掌握和使用關(guān)鍵字有助于我們更加熟悉了解C語(yǔ)言,同時(shí)C語(yǔ)言的關(guān)鍵字也是面試筆試中??嫉膬?nèi)容。C語(yǔ)言的關(guān)鍵字共有32個(gè),但并不是每個(gè)關(guān)鍵字都有坑,本篇文章將通過(guò)理論聯(lián)系實(shí)際的方式為大家講解C語(yǔ)言中易混易錯(cuò)以及??嫉囊恍╆P(guān)鍵字2022-05-05
C語(yǔ)言 makefile學(xué)習(xí)及實(shí)現(xiàn)實(shí)例
這篇文章主要介紹了C語(yǔ)言 makefile學(xué)習(xí)及實(shí)現(xiàn)實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-03-03
C語(yǔ)言中動(dòng)態(tài)內(nèi)存管理圖文詳解
在編寫程序時(shí),通常并不知道需要處理的數(shù)據(jù)量,或者難以評(píng)估所需處理數(shù)據(jù)量的變動(dòng)程度,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中動(dòng)態(tài)內(nèi)存管理的相關(guān)資料,需要的朋友可以參考下2022-06-06
Qt編寫地圖實(shí)現(xiàn)閃爍點(diǎn)圖的示例代碼
閃爍點(diǎn)圖的核心有三個(gè)要素,城市的名稱、城市的經(jīng)緯度、對(duì)應(yīng)值的大小,當(dāng)值越大閃爍點(diǎn)也就越大,本文就來(lái)實(shí)現(xiàn)一下地圖閃爍點(diǎn)圖,具有一定的參考價(jià)值,感興趣的可以了解一下2021-12-12
采用C++實(shí)現(xiàn)區(qū)間圖著色問(wèn)題(貪心算法)實(shí)例詳解
這篇文章主要介紹了采用C++實(shí)現(xiàn)區(qū)間圖著色問(wèn)題(貪心算法),很經(jīng)典的算法問(wèn)題,需要的朋友可以參考下2014-07-07

