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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

compareHist函数 例子

發(fā)布時(shí)間:2025/4/16 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 compareHist函数 例子 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

功能是:打開攝像頭,鼠標(biāo)選定一個框,框內(nèi)圖像作為標(biāo)準(zhǔn)圖像,計(jì)算出其直方圖并顯示出來;然后繼續(xù)鼠標(biāo)選定框,該框內(nèi)的圖像的直方圖與標(biāo)準(zhǔn)圖像的進(jìn)行相似度計(jì)算,計(jì)算結(jié)果在終端輸出,數(shù)值越大表示相似度越大。


opencv代碼:

// hist_test.cpp : 定義控制臺應(yīng)用程序的入口點(diǎn)。 //#include "stdafx.h" #include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> #include <stdio.h>using namespace cv; using namespace std;int nFrame_num=0; bool pause=false; bool tracking=false; Rect preselectROI,selectROI;//用于存放手選的矩形 bool comp=true;Mat rhist,ghist,bhist; int channels[]={0,1,2}; //const int histsize[]={256,256,256}; const int histsize[]={16,16,16}; const int histsize1=16; float rranges[]={0,255}; float granges[]={0,255}; float branges[]={0,255}; float range[]={0,255}; const float *ranges1={range};//這里的ranges就相當(dāng)于一個雙指針了 const float *ranges[]={rranges,granges,branges};//ranges是個雙指針,且前面一定要用const,即不可改變常量,提高程序的可讀性和穩(wěn)健性 //const float *ranges[]={{0,255},{0,255},{0,255}};void onMouse(int event,int x,int y,int,void *) {if(event==CV_EVENT_LBUTTONDOWN){selectROI.x=x;selectROI.y=y;tracking=false;}else if(event==CV_EVENT_LBUTTONUP){selectROI.width=x-selectROI.x;selectROI.height=y-selectROI.y;tracking=true;comp=true;nFrame_num++;//選定后才算真正意義上的第一幀if(nFrame_num>=10)nFrame_num=10;//防止nFrame_num溢出} }int main(int argc, const char* argv[]) {Mat frame,img;Mat staRoiHist;MatND RoiHist;int DRAW_H=400,DRAW_W=400;Mat draw(DRAW_W,DRAW_H,CV_8UC3,Scalar(0,0,0));//建立一個顯示直方圖的圖片,背景為純黑色int DRAW_BIN_W=cvRound(DRAW_W/histsize1);/****打開攝像頭****/VideoCapture cam(0);if(!cam.isOpened())return -1;/****鼠標(biāo)捕捉****/namedWindow("camera",1);namedWindow("rgb_hist",1);setMouseCallback("camera",onMouse,0);//這里用的是面向?qū)ο蟮乃枷?#xff0c;只要有鼠標(biāo)動作就會調(diào)用鼠標(biāo)響應(yīng)函數(shù)while(1){if(!pause)//暫停按鈕只需控制視頻的讀取{ cam>>frame;if(frame.empty())break;//break此處跳出的是while語句,一般是跳出for或while語句,不要理解為跳出if語句}/* if(1==nFrame_num){}*/if(tracking){Mat RoiImage(frame,selectROI);/*************************************************************************************************************************//**** calcHist():計(jì)算圖像塊的直方圖矩陣 ****//****calcHist(),第1個參數(shù)為原數(shù)組區(qū)域列表;第二個參數(shù)為有計(jì)算幾個原數(shù)組;參數(shù)3為需要統(tǒng)計(jì)的通道索引數(shù);參數(shù)4為操作掩碼****//****第5個參數(shù)為存放目標(biāo)直方圖矩陣;參數(shù)6為需要計(jì)算的直方圖的維數(shù);參數(shù)7為每一維的bin的個數(shù);參數(shù)8為每一維數(shù)值的取值范圍****//****參數(shù)10為每個bin的大小是否相同的標(biāo)志,默認(rèn)為1,即bin的大小都相同;參數(shù)11為直方圖建立時(shí)清除內(nèi)存痕跡標(biāo)志,默認(rèn)為0,即清除****//*************************************************************************************************************************/calcHist(&RoiImage,1,channels,Mat(),RoiHist,3,histsize,ranges);//原數(shù)組區(qū)域RoiImage,1個源,需要統(tǒng)計(jì)的通道索引為{0,1,2},//目標(biāo)直方圖RoiHist,3維,每一維的bin數(shù)histsize,取值范圍為//ranges,實(shí)際上計(jì)算出的目標(biāo)矩陣類似一維矩陣。/*************************************************************************************************************************//**** normalize():根據(jù)某種范數(shù)或者數(shù)值范圍歸一化數(shù)組 ****//**** normalize(),參數(shù)1表示需要?dú)w一化的數(shù)組;參數(shù)2為歸一化后的目的數(shù)組;參數(shù)3表示輸出數(shù)值的最小值/最大值或者輸出數(shù)值的范數(shù);****//**** 參數(shù)4表示輸出數(shù)值的最小值/最大值;參數(shù)5表示歸一化數(shù)組使用的歸一化類型,默認(rèn)值為使用L2范數(shù);參數(shù)6為對應(yīng)元素的掩膜矩陣 ****//**** 默認(rèn)值為空,即不采用掩膜操作 ****//*************************************************************************************************************************/normalize(RoiHist,RoiHist);//使用L2范數(shù)將RoiHist直方圖原地歸一化vector<Mat> rgb_planes;//這里的vector為向量,向量的數(shù)據(jù)類型為Mat結(jié)構(gòu)體,向量的長度為3split(RoiImage,rgb_planes);//將rgb圖分解到rgb_planes各個分量中calcHist(&rgb_planes[0],1,0,Mat(),rhist,1,&histsize1,&ranges1);normalize(rhist,rhist,0,DRAW_H,NORM_MINMAX);//進(jìn)行最大最小值歸一化calcHist(&rgb_planes[1],1,0,Mat(),ghist,1,&histsize1,&ranges1);normalize(ghist,ghist,0,DRAW_H,NORM_MINMAX);calcHist(&rgb_planes[2],1,0,Mat(),bhist,1,&histsize1,&ranges1);normalize(bhist,bhist,0,DRAW_H,NORM_MINMAX);if(nFrame_num==1){ // preselectROI=selectROI;preselectROI.x=selectROI.x;preselectROI.y=selectROI.y;preselectROI.width=selectROI.width;preselectROI.height=selectROI.height;staRoiHist=RoiHist.clone();//第一次選定目標(biāo),作為標(biāo)準(zhǔn)模板目標(biāo)}else if(nFrame_num>1&&comp==true){/*************************************************************************************************************************//**** compareHist():比較2個直方圖的相似度 ****//**** compareHist(),參數(shù)1為比較相似度的直方圖1;參數(shù)2為比較相似度的直方圖2;參數(shù)3為相似度的計(jì)算方式。有四種, ****//**** 分別為CV_COMP_CORREL,CV_COMP_CHISQR,CV_COMP_INTERSECT,CV_COMP_BHATTACHARYYA ****//*************************************************************************************************************************/double distence=compareHist(staRoiHist,RoiHist,CV_COMP_INTERSECT);//計(jì)算后面選定的與這次選定的相似度,使用INTERSECT,值越大越相似printf("與第1次選定的圖像區(qū)域相似度為:%f\n",distence);//數(shù)組越大,相似度越大//顯示直方圖for(int i=1;i<histsize1;i++){//畫直線中要注意2點(diǎn),因?yàn)閳D片的原點(diǎn)在左上角,而直方圖坐標(biāo)系的原點(diǎn)在左下角,所以高度值都需要被直方圖圖紙高度減掉,另外取一維直方圖時(shí)只能用at運(yùn)算符line(draw,Point(DRAW_BIN_W*(i-1),DRAW_H-cvRound(rhist.at<float>((i-1)))),Point(DRAW_BIN_W*(i),DRAW_H-cvRound(rhist.at<float>(i))),Scalar(255,0,0),2,8,0);line(draw,Point(DRAW_BIN_W*(i-1),DRAW_H-cvRound(ghist.at<float>((i-1)))),Point(DRAW_BIN_W*(i),DRAW_H-cvRound(ghist.at<float>(i))),Scalar(0,255,0),2,8,0);line(draw,Point(DRAW_BIN_W*(i-1),DRAW_H-cvRound(bhist.at<float>((i-1)))),Point(DRAW_BIN_W*(i),DRAW_H-cvRound(bhist.at<float>(i))),Scalar(0,0,255),2,8,0);}imshow("rgb_hist",draw);draw=Mat::zeros(DRAW_W,DRAW_H,CV_8UC3);//每畫完一次直方圖后都進(jìn)行一次清0操作comp=false;}rectangle(frame,selectROI,Scalar(0,255,0),2,8);//手動選定一次就顯示一次}//end trackingrectangle(frame,preselectROI,Scalar(0,0,255),5,8);//初始的選定目標(biāo)一直不變imshow("camera",frame);//鍵盤響應(yīng)char c = (char)waitKey(10);if( c == 27 )break;switch(c){case 'p'://暫停鍵pause = !pause;break;default:;}}//end while;return 0; }

總結(jié)

以上是生活随笔為你收集整理的compareHist函数 例子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。