opencv 最大連通域_opencv 查找連通區域 最大面積實例

今天在弄一個查找連通的最大面積的問題。

要把圖像弄成黑底,白字,這樣才可以正確找到。

然后調用下邊的方法:

RETR_CCOMP:提取所有輪廓,并將輪廓組織成雙層結構(two-level hierarchy),頂層為連通域的外圍邊界,次層位內層邊界

#include

#include

using namespace cv;

using namespace std;

int main( int argc, char** argv )

{

Mat src = imread( argv[1] );

int largest_area=0;

int largest_contour_index=0;

Rect bounding_rect;

Mat thr;

cvtColor( src, thr, COLOR_BGR2GRAY ); //Convert to gray

threshold( thr, thr, 125, 255, THRESH_BINARY ); //Threshold the gray

bitwise_not(thr,thr); //這里先變反轉顏色

vector > contours; // Vector for storing contours

findContours( thr, contours, RETR_CCOMP, CHAIN_APPROX_SIMPLE ); // Find the contours in the image

for( size_t i = 0; i< contours.size(); i++ ) // iterate through each contour.

{

double area = contourArea( contours[i] ); // Find the area of contour

if( area > largest_area )

{

largest_area = area;

largest_contour_index = i; //Store the index of largest contour

bounding_rect = boundingRect( contours[i] ); // Find the bounding rectangle for biggest contour

}

}

drawContours( src, contours,largest_contour_index, Scalar( 0, 255, 0 ), 2 ); // Draw the largest contour using previously stored index.

imshow( "result", src );

waitKey();

return 0;

}

方法二: connectedComponentsWithStats

std::pair< int , int > MaxAreaFromSource(Mat srcImage, Mat &dstImage, int index)

{

/*

vector > contours; // Vector for storing contours

int largest_area=0;

size_t largest_contour_index=0;

Rect bounding_rect;

findContours( srcImage, contours, RETR_CCOMP, CHAIN_APPROX_SIMPLE ); // Find the contours in the image

for( size_t i = 0; i< contours.size(); i++ ) // iterate through each contour.

{

double area = contourArea( contours[i] ); // Find the area of contour

if( area > largest_area )

{

largest_area = area;

largest_contour_index = i; //Store the index of largest contour

bounding_rect = boundingRect( contours[i] ); // Find the bounding rectangle for biggest contour

}

}

Mat dst;

cvtColor(srcImage, dst, CV_GRAY2RGB);

drawContours( dst, contours,largest_contour_index, Scalar( 0, 255, 0 ), 2 ); // Draw the largest contour using previously stored index.

imshow( "result", dst );

waitKey();

printf("%%%%%%%%%%%max area:%d\n", largest_area);

return make_pair( largest_area, index);

*/

cv::Mat img_bool, labels, stats, centroids, img_color, img_gray;

//連通域計算

int nccomps = cv::connectedComponentsWithStats (

srcImage, //二值圖像

labels, //和原圖一樣大的標記圖

stats, //nccomps×5的矩陣 表示每個連通區域的外接矩形和面積(pixel)

centroids //nccomps×2的矩陣 表示每個連通區域的質心

);

//cv::imshow("labels", labels);

//cv::waitKey();

vector<:vec3b> colors(nccomps);

colors[0] = cv::Vec3b(0,0,0); // background pixels remain black.

printf( "index:%d==================\n",index );

vector< int >vec_width,vec_area,vec_height;

for(int label = 1; label < nccomps; ++label)

{

colors[label] = cv::Vec3b( (std::rand()&255), (std::rand()&255), (std::rand()&255) );

std::cout << "Component "<< label << std::endl;

std::cout << "CC_STAT_LEFT = " << stats.at(label,cv::CC_STAT_LEFT) << std::endl;

std::cout << "CC_STAT_TOP = " << stats.at(label,cv::CC_STAT_TOP) << std::endl;

std::cout << "CC_STAT_WIDTH = " << stats.at(label,cv::CC_STAT_WIDTH) << std::endl;

std::cout << "CC_STAT_HEIGHT = " << stats.at(label,cv::CC_STAT_HEIGHT) << std::endl;

std::cout << "CC_STAT_AREA = " << stats.at(label,cv::CC_STAT_AREA) << std::endl;

std::cout << "CENTER = (" << centroids.at(label, 0) <(label, 1) << ")"<< std::endl << std::endl;

int area = stats.at(label,cv::CC_STAT_AREA);

int left = stats.at(label,cv::CC_STAT_LEFT);

int top = stats.at(label,cv::CC_STAT_TOP);

int width = stats.at(label,cv::CC_STAT_WIDTH);

int height = stats.at(label,cv::CC_STAT_HEIGHT);

vec_area.push_back(area);

vec_width.push_back(width);

vec_height.push_back(height);

}

vector::iterator bigwidth = std::max_element(std::begin(vec_width), std::end(vec_width));

vector::iterator bigheight = std::max_element(std::begin(vec_height), std::end(vec_height));

vector::iterator bigarea = std::max_element(std::begin(vec_area), std::end(vec_area));

//printf( "area:%d------------width:%d height:%d \n", *bigarea, *bigwidth, *bigheight );

//按照label值,對不同的連通域進行著色

img_color = cv::Mat::zeros(srcImage.size(), CV_8UC3);

for( int y = 0; y < img_color.rows; y++ )

for( int x = 0; x < img_color.cols; x++ )

{

int label = labels.at(y, x);

CV_Assert(0 <= label && label <= nccomps);

img_color.at<:vec3b>(y, x) = colors[label];

}

cv::imshow("color", img_color);

cv::waitKey();

return make_pair( *bigarea , index );

}

我先用這個函數實現了一下,效果正確,還是opencv demo 是正確的,網上找了個例子,害死我了。

說明一下:方法一 比 第二種方法 運行速度快很多哦! 這一點很重要。

以上這篇opencv 查找連通區域 最大面積實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持隨便開發網。

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

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

相關文章

JS 函數柯里化

在計算機科學中&#xff0c;柯里化是把接受多個參數的函數變換成接受一個單一參數&#xff08;最初函數的第一個參數&#xff09;的函數&#xff0c;并且返回接受余下的參數而且返回結果的新函數的技術。——詳見 維基百科柯里化就是預先將某些參數傳入&#xff0c;得到一個簡單…

LTI系統的物理可實現性與希爾伯特變換

產品的設計一般為線性時不變系統&#xff0c;要求系統具有物理可實現性&#xff0c;從時域上看&#xff0c;h(t)具有因果性&#xff1b;從頻域上看&#xff0c;|H(jw)|符合佩利—維納準則。任何具有因果性的系統&#xff0c;|H(jw)|的實部R(w)滿足希爾伯特變換&#xff0c;|H(j…

垂死掙扎還是涅槃重生 -- Delphi XE5 公布會歸來感想

Delphi 是一個基本上被我遺忘的工具&#xff0c; 要不是在使用RapidSql , 我是收不到Embarcadero 公司發出的邀請來參加Delphi XE5的公布會的。 有人可能要問為什么是Embarcadero &#xff08;名稱很拗口&#xff09;而不是Borland 開Delphi 公布會&#xff0c; 這是由于Borla…

iOS Appstore 版本更新

1&#xff0c;版本更新 通過比較構建號/版本號 檢查更新 /// 構建號 50 // NSString * currentVersion [NSBundle mainBundle].infoDictionary["CFBundleVersion"];/// 版本號 2.2.0//CFBundleShortVersionStringNSString * currentVersion [NSBundle mainBund…

ubuntu下安裝國際版QQ

在網上看到了好多的ubuntu下安裝QQ的方法 好多 下面是看別人的文章 來測試的一篇 ubuntu下 安裝國際版QQhttp://www.ubuntukylin.com/applications/showimg.php?langcn&id23下載 地址網盤:http://yun.baidu.com/share/link?shareid2983202140&uk202032639下載好以后 …

傅里葉變換應用——信號調制與解調

傅里葉變換的典型應用主要用于通信的信號調制與解調&#xff0c;信號調制的目的是將信號進行變換&#xff0c;使其便于傳輸。頻率調制是將低頻信號調制到高頻載波信號上。同步信號解調是接受系統產生同步的高頻載波信號進行解調&#xff0c;從調制信號中恢復原信號的過程。調制…

cocos2d-x返回Android游戲黑屏解決辦法

返回Android游戲黑屏解決辦法這幾天逛cocos2d-x.org論壇&#xff0c;發現cocos2d-x的作者放出來一個帖子&#xff0c;用來解決返回Android游戲加載資源時黑屏的問題。帖子過些日子估計就沉了&#xff0c;所以轉出來&#xff0c;以供后面查詢。需要修改三個文件&#xff1a;1) c…

vue重要特性

重要特性 自定義input組件動態組件遞歸組件slot作用域slot異步組件內聯模板子組件索引進階 自定義指令狀態管理vuex單文件組件生產部署路由xxx

連續時間系統與離散時間系統的時域分析對比

通過學習離散時間系統的時域分析&#xff0c;發現其與連續時間系統的時域分析有很多相似之處&#xff0c;自己做了一個專題拓展&#xff0c;從數學模型描述到時域分析方法對兩大系統進行橫向對比&#xff0c;總結兩者之間的聯系和異同點。

python獲取當前時間的源代碼_Python獲取時間戳代碼實例

1、獲取秒級時間戳與毫秒級時間戳、微秒級時間戳import timeimport datetimet time.time()print (t) #原始時間數據print (int(t)) #秒級時間戳print (int(round(t * 1000))) #毫秒級時間戳print (int(round(t * 1000000))) #微秒級時間戳返回1499825149.257892 #原始時間數據…

AutoLayout bug集合

NSInternalInconsistencyException, reason: <NSISEngine: 0x16d5ef10>... http://stackoverflow.com/questions/28111635/ios-aspect-ratio-constraint-breaks-on-ios7-works-on-ios8 這好像是ios7.1的bug,對浮點數計算有誤,一般添加按鈕比例約束的時候multiplier值都是…

[SQL Server]重命名數據庫【轉】

原文鏈接&#xff1a;http://www.cnblogs.com/Ryan_j/archive/2011/04/03/2004428.html 重命名數據庫很簡單&#xff0c;選擇數據庫--右鍵--重命名數據庫 或者 sp_renamedb oldDB ,newDB 但是你再新建的相同名字的數據庫就會報錯&#xff0c;提示數據庫已經存在 比如test數據庫…

DCOS實踐分享(4):如何基于DC/OS整合SMACK(Spark, Mesos, Akka, Cassandra, Kafka)

這篇文章入選CSDN極客頭條 http://geek.csdn.net/news/detail/71572 當前&#xff0c;要保證業務的市場競爭力&#xff0c;僅靠設計一個可用并且好看的產品&#xff0c;已經完全不能滿足要求。全球消費者都希望產品能夠足夠的智能化&#xff0c;通過大數據分析來改善他們的用戶…

連續系統的卷積積分與離散系統的卷積和

在LTI連續系統中&#xff0c;以沖激函數為基本信號&#xff0c;將任意信號分解&#xff0c;從而得到連續系統的零狀態響應等于激勵與系統沖激響應的卷積積分 &#x1d466;&#x1d467;&#x1d460;&#x1d461;&#x1d453;&#x1d461;?h&#x1d461; 在LTI離散…

自學python從零開始學_新手學習python-從零開始學習

1.學習pythonurllib2 常用方法urlopen(url, data, timeout)urllib2.Request()urllib.urlencode()params {}get : url "?" paramshttp:請求分析User-Agent : 有些服務器或 Proxy 會通過該值來判斷是否是瀏覽器發出的請求Content-Type : 在使用 REST 接口時&#x…

【數據結構】圖的深度優先搜索

圖的深度優先搜索類似于樹的深度優先搜索。不同的是&#xff0c;圖中可能包括循環&#xff0c;即我們有可能重復訪問節點。為了避免訪問已經訪問過的節點&#xff0c;我們要使用一個布爾變量的數組。 例如&#xff0c;在下圖中&#xff0c;我們從節點2開始訪問。當訪問到節點0&…

flex中dispatchEvent的用法(自定義事件) .

Evevt和EventDispatcher類在as3的事件機制中是很重要的角色&#xff0c;dispatchEvent()是EventDispatcher類的一個事件發送方法&#xff0c;它可以發送出Event類或其子類的實例&#xff0c;在as3中所有的顯示對象都可以發送事件&#xff0c;因為as3中所有的顯示對象都是EventD…

菜鳥超級進口大倉618首度亮相!跨境商品也能當日次日達

6月12日下午3點40分&#xff0c;來自南京的一名用戶收到了由寧波保稅倉發出、圓通速遞配送的雀巢咖啡&#xff0c;這距離他在天貓國際上下單僅過去4小時。 天貓618在昨日迎來進口日&#xff0c;進口銷量火爆上升。作為國內最為先進的跨境進口倉&#xff0c;菜鳥超級大倉在本次大…

頻域/s域/z域三大變換的發展史及其聯系

本文主要介紹三大變換&#xff08;傅里葉變換、拉普拉斯變換及Z變換&#xff09;的發展史及其之間的聯系。

Tomcat8.0.21登錄時忘記用戶名和密碼

大概是這學期開學沒多久吧&#xff0c;4月份的時候&#xff0c;為了學習javaEE&#xff0c;裝了Tomcat。過了這么久早就忘記用戶名和密碼了&#xff0c;所以無法進入Tomcat的管理界面。百度&#xff08;其實我也很想用google&#xff09;了一堆&#xff0c;幾乎都是修改用戶配置…