opencv 直方圖反向投影

轉載至:http://www.cnblogs.com/zsb517/archive/2012/06/20/2556508.html

直方圖反向投影式通過給定的直方圖信息,在圖像找到相應的像素分布區域,opencv提供兩種算法,一個是基于像素的,一個是基于塊的。

使用方法不寫了,可以參考一下幾個網站:

直方圖反向投影參考1

直方圖參考2

?

測試例子1:灰度直方圖反向投影


IplImage * image= cvLoadImage("22.jpg");  
IplImage * image2= cvLoadImage("2.jpg");  
int hist_size=256;  
float range[] = {0,255};  
float* ranges[]={range};  IplImage* gray_plane = cvCreateImage(cvGetSize(image),8,1);  
cvCvtColor(image,gray_plane,CV_BGR2GRAY);  
CvHistogram* gray_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);  
cvCalcHist(&gray_plane,gray_hist,0,0);  
//cvNormalizeHist(gray_hist,1.0);  IplImage* gray_plane2 = cvCreateImage(cvGetSize(image2),8,1);  
cvCvtColor(image2,gray_plane2,CV_BGR2GRAY);  
//CvHistogram* gray_hist2 = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);  
//cvCalcHist(&gray_plane2,gray_hist2,0,0);  
//cvNormalizeHist(gray_hist2,1.0);  
IplImage* dst = cvCreateImage(cvGetSize(gray_plane2),IPL_DEPTH_8U,1);  cvCalcBackProject(&gray_plane2, dst ,gray_hist);
cvEqualizeHist(dst,dst);
//產生的圖像太暗,做了一些直方圖均衡cvNamedWindow( "dst");  
cvShowImage("dst",dst);  
cvNamedWindow( "src");  
cvShowImage( "src", image2 );  
cvNamedWindow( "templ");  
cvShowImage( "templ", image );  
cvWaitKey();

效果圖:

?2
第一個圖為源圖像,中間的那個小圖像是產生用于反向投影的直方圖的圖像,最后的用直方圖均衡化后的結果圖像,可以看到,蘋果的像素位置幾被找到了。

?

測試例子2:彩色直方圖反向投影測試


IplImage*src= cvLoadImage("myhand2.jpg", 1);  
IplImage*templ=cvLoadImage("myhand3.jpg",1);cvNamedWindow( "Source" );  
cvShowImage( "Source", src );  IplImage* h_plane2 = cvCreateImage( cvGetSize(src), 8, 1 );      
IplImage* s_plane2 = cvCreateImage( cvGetSize(src), 8, 1 );    
IplImage* v_plane2 = cvCreateImage( cvGetSize(src), 8, 1); 
IplImage* planes2[] = { h_plane2, s_plane2,v_plane2 };IplImage* hsv2 = cvCreateImage( cvGetSize(src), 8, 3 );
cvCvtColor( src, hsv2, CV_BGR2HSV );    
cvSplit( hsv2, h_plane2, s_plane2, v_plane2, 0 );
printf("h%d",h_plane2->widthStep);
printf("s%d",h_plane2->widthStep);
printf("v%d",h_plane2->widthStep);IplImage* h_plane = cvCreateImage( cvGetSize(templ), 8, 1 );      
IplImage* s_plane = cvCreateImage( cvGetSize(templ), 8, 1 );    
IplImage* v_plane = cvCreateImage( cvGetSize(templ), 8, 1);    
IplImage* planes[] = { h_plane, s_plane,v_plane };
IplImage* hsv = cvCreateImage( cvGetSize(templ), 8, 3 );  
cvCvtColor( templ, hsv, CV_BGR2HSV );    
cvSplit( hsv, h_plane, s_plane, v_plane, 0 );
printf("h%d\n",h_plane->widthStep);
printf("s%d\n",s_plane->widthStep);
printf("v%d\n",v_plane->widthStep);int h_bins = 16, s_bins = 16,v_bins=16;
int hist_size[] = {h_bins, s_bins,v_bins};
float h_ranges[] = {0,255};
float s_ranges[] = {0,255};
float v_ranges[] = {0,255};
float* ranges[] = { h_ranges, s_ranges,v_ranges};
CvHistogram* hist;
hist = cvCreateHist( 3, hist_size, CV_HIST_ARRAY, ranges, 1 ); 
cvCalcHist( planes, hist, 0, 0 );
//1.double a=1.f;
//2.cvNormalizeHist(hist,a);
//templ's hist is just calculateIplImage*back_project=cvCreateImage(cvGetSize(src),8,1);//!!歸一,把改成,就彈出對話框,說planes的steps不是一致的!cvZero(back_project);                                  //但是我去掉歸一,改成就可以顯示//NOW we begin calculate back projectcvCalcBackProject(planes2,back_project,hist);cvNamedWindow( "back_project" );  
cvShowImage( "back_project", back_project );  cvWaitKey(0);

測試結果:

?QQ截圖20120620142552

手的膚色位置基本找到了,但是有一個問題,在做直方圖反向的時候,直方圖分級是16等分,并不是256等分,下圖是32等分和8等分的圖像效果:

4????? 32等分?5?8等分

程序里面使用了SHV分量,也算是膚色檢測的一個實例,里面的顏色區分很明顯,所有采用大一點的區域統計,能更好的找到膚色的位置,如果采用很細的顏色區分,光照的影響也會考慮進去了。

測試例子3:基于塊的直方圖投影

這種方法速度很慢,模版圖像別弄的太大了。


IplImage*src= cvLoadImage("2.jpg", 1);  
IplImage*templ=cvLoadImage("22.jpg",1);cvNamedWindow( "Source" );  
cvShowImage( "Source", src );  IplImage* h_plane2 = cvCreateImage( cvGetSize(src), 8, 1 );      
IplImage* s_plane2 = cvCreateImage( cvGetSize(src), 8, 1 );    
IplImage* v_plane2 = cvCreateImage( cvGetSize(src), 8, 1); 
IplImage* planes2[] = { h_plane2, s_plane2,v_plane2 };IplImage* hsv2 = cvCreateImage( cvGetSize(src), 8, 3 );
cvCvtColor( src, hsv2, CV_BGR2HSV );    
cvSplit( hsv2, h_plane2, s_plane2, v_plane2, 0 );
printf("h%d",h_plane2->widthStep);
printf("s%d",h_plane2->widthStep);
printf("v%d",h_plane2->widthStep);IplImage* h_plane = cvCreateImage( cvGetSize(templ), 8, 1 );      
IplImage* s_plane = cvCreateImage( cvGetSize(templ), 8, 1 );    
IplImage* v_plane = cvCreateImage( cvGetSize(templ), 8, 1);    
IplImage* planes[] = { h_plane, s_plane,v_plane };
IplImage* hsv = cvCreateImage( cvGetSize(templ), 8, 3 );  
cvCvtColor( templ, hsv, CV_BGR2HSV );    
cvSplit( hsv, h_plane, s_plane, v_plane, 0 );
printf("h%d\n",h_plane->widthStep);
printf("s%d\n",s_plane->widthStep);
printf("v%d\n",v_plane->widthStep);int h_bins = 16, s_bins = 16,v_bins=16;
int hist_size[] = {h_bins, s_bins,v_bins};
float h_ranges[] = {0,255};
float s_ranges[] = {0,255};
float v_ranges[] = {0,255};
float* ranges[] = { h_ranges, s_ranges,v_ranges};
CvHistogram* hist;
hist = cvCreateHist( 3, hist_size, CV_HIST_ARRAY, ranges, 1 ); 
cvCalcHist( planes, hist, 0, 0 );CvSize temp ;
temp.height = src->height - templ->height + 1;
temp.width  = src->width - templ->width + 1;
IplImage*back_project=cvCreateImage(temp,IPL_DEPTH_32F,1);//!!歸一,把改成,就彈出對話框,說planes的steps不是一致的!cvZero(back_project);                                     //但是我去掉歸一,改成就可以顯示
cvCalcBackProjectPatch(planes2, back_project, cvGetSize(templ), hist,CV_COMP_INTERSECT ,1);cvNamedWindow( "back_project" );  
cvShowImage( "back_project", back_project );  cvWaitKey(0);


測試圖像:

當模版圖像小雨目標的時候,作為區域檢測器,測試如下:可以找到手區域

6

當模版等于目標的時候,測試如下:輸出圖像,較亮的部分就是人的頭部大致位置

7

基于塊的反向,速度太慢了。



轉載于:https://www.cnblogs.com/zfluo/p/5131870.html

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

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

相關文章

request請求在Struts2中的處理步驟

2019獨角獸企業重金招聘Python工程師標準>>> 一個請求在Struts2框架中的處理大概分為以下幾個步驟 1 客戶端初始化一個指向Servlet容器(例如Tomcat)的請求 2 這個請求經過一系列的過濾器(Filter)(這些過濾…

vs聯合torch,ZED相機api,opencv建立C++項目

ZED相機api下載及cmake教程 generate產生工程文件后打開,配置如下: 將ZED項目作為啟動項 然后在main.cpp中寫入自己的工程代碼即可,運行也在release X64下進行 注:cmake之前源文件下main.cpp,也就是tutorial 1 - h…

POJ 2186

//在一張有向無環圖G,圖G會包含很多環(環里面的點是等價的), //當然可以把環縮成一個點(利用tarjan縮點), //形成一棵樹,題目要求是求除他以外的點都指向他,也就是只有一…

使用DataGridView數據窗口控件,構建用戶快速輸入體驗

使用DataGridView數據窗口控件,構建用戶快速輸入體驗 在“隨風飄散” 博客里面,介紹了一個不錯的DataGridView數據窗口控件《DataGridView數據窗口控件開發方法及其源碼提供下載》,這種控件在有些場合下,還是非常直觀的。因為&…

pip安裝

下載pip安裝包,解壓。復制到C:\Users\administrator\下,用cmd打開當前文件夾,用Python安裝, Python setup.py install 安裝完之后記得把Python根目錄下的scripts也放在環境變量里。 以上是我pip安裝的成功例子,可能不…

深入剖析授權在WCF中的實現[共14篇]

I、身份(Identity)與安全主體(Security Principal) 從兩個重要的概念談起:Identity與Principal[上篇] 從兩個重要的概念談起:Identity與Principal[下篇] WCF的三種授權模式 II、Windows用戶組授權 基于Wind…

sqlserver 查看鎖表,解鎖

查看被鎖表: 代碼如下 復制代碼 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_typeOBJECT spid 鎖表進程 tableName 被鎖表名 [more] 解鎖: 創建一個臨時Table 代碼如下…

json2.js參考

json2.js使用參考 json2.js提供了json的序列化和反序列化方法&#xff0c;能夠將一個json對象轉換成json字符串&#xff0c;也能夠將一個json字符串轉換成一個json對象。<html><head><script type"text/javascript" src"jquery.js"><…

手把手教你用1行代碼實現人臉識別 -- Python Face_recognition

2019獨角獸企業重金招聘Python工程師標準>>> 環境要求&#xff1a; Ubuntu17.10Python 2.7.14環境搭建&#xff1a; 1. 安裝 Ubuntu17.10 > 安裝步驟在這里 2. 安裝 Python2.7.14 (Ubuntu17.10 默認Python版本為2.7.14) 3. 安裝 git 、cmake 、 python-pip # 安裝…

pip安裝的庫導入pycharm中

用pip安裝了一些庫&#xff0c;但pycharm中卻沒有&#xff0c;解決方法是

javascript數組淺談1

最近心血來潮要開始玩博客了&#xff0c;剛好也在看數組這塊內容&#xff0c;第一篇就只好拿數組開刀了&#xff0c;自己總結的&#xff0c;有什么不對的地方還請批評指正&#xff0c;還有什么沒寫到的方面也可以提出來我進行完善&#xff0c;謝謝~~ 首先&#xff0c;大概說說數…

一個關于解決序列化問題的編程技巧

在前一篇文章中我曾經說過&#xff0c;現在正在做一個小小的框架以實現采用統一的API實現對上下文&#xff08;Context&#xff09;信息的統一管理。這個框架同時支持Web和GUI應用&#xff0c;并支持跨線程傳遞和跨域傳遞&#xff08;這里指在WCF服務調用中實現客戶端到服務端隱…

踩坑之路anaconda創建虛擬環境

渾渾噩噩的過了三年渣碩生涯&#xff0c;雖然說自己是搞圖像的&#xff0c;但基本是一些機器視覺的東西&#xff0c;最近突然想好好搞搞深度學習這方面&#xff0c;想著那就先搭搭環境跑個demo吧&#xff0c;經歷了好多莫名其妙的踩坑操作&#xff0c;demo跑的終于沒bug了&…

IP多播技術及其應用

隨著全球互聯網&#xff08;Internet&#xff09;的迅猛發展&#xff0c;上網人數正以幾何級數快速增長&#xff0c;以因特網技術為主導的數據通信在通信業務總量中的比列迅速上升&#xff0c;因特網業務已成為多媒體通信業中發展最為迅速、競爭最為激烈的領域。Internet網絡傳…

【轉載】惱人的函數指針(一)

本文轉載自: http://www.cnblogs.com/AnnieKim/archive/2011/11/20/2255813.html#undefined> 這篇是為了加深記憶所寫。發現&#xff0c;很多知識若不經過反復的琢磨和動手實踐&#xff0c;是很難記得住的。 1&#xff09; 函數指針的初始化。 函數如下&#xff1a; int Com…

dns服務器未響應

昨天還好好的&#xff0c;今天打開電腦顯示DNS服務器為響應。 解決辦法&#xff1a;右擊電腦下方圖標欄——打開Windows任務管理器——服務——服務&#xff08;s&#xff09;——找到DNS client和DHCP client——右擊重啟

php分頁原理

<?php 1.分頁原理所需數據&#xff1a; 總記錄數&#xff1a; $records mysql_num_rows() 每頁顯示&#xff1a; $pagesize 人為定義10 總頁數&#xff1a; $pages $records/$pagesize 當前頁&#xff1a; $page 自己選擇2.分頁的sql語句&#xff1a; SELECT * F…

從客戶端(CourseIssueContent=P財務審計師崗位認證招生簡章BR...)中檢測到有潛在危險的 Request.Form 值。...

說明: 請求驗證過程檢測到有潛在危險的客戶端輸入值&#xff0c;對請求的處理已經中止。該值可能指示危及應用程序安全的嘗試&#xff0c;如跨站點的腳本攻擊。通過在 Page 指令或 配置節中設置 validateRequestfalse 可以禁用請求驗證。但是&#xff0c;在這種情況下&#xff…

ubuntu安裝pytorch鏡像修改及下載

ubuntu安裝pytorch鏡像修改及下載 下載pytorch下載太慢&#xff0c;搞了很長時間&#xff0c;終于改好鏡像能快速下載了&#xff0c;記錄以下。 1.在/home/用戶名/ 下找到/.condarc 文件&#xff0c;可能需要你右擊鼠標顯示隱藏文件才能顯示&#xff0c; 2.把內容修改為清華等鏡…

R--線性回歸診斷(一)

線性回歸診斷--R 【轉載時請注明來源】&#xff1a;http://www.cnblogs.com/runner-ljt/ Ljt 勿忘初心 無畏未來 作為一個初學者&#xff0c;水平有限&#xff0c;歡迎交流指正。 在R中線性回歸&#xff0c;一般使用lm函數就可以得到線性回歸模型&#xff0c;但是得到的模型…