资源描述:
《基础学习笔记之opencv(4):直方图使用学习.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、目的: 直方图在cv领域到处可见,因为其功能在cv算法的实现中必不可少。Opencv库中也集成了关于直方图的不少函数,比如直方图的计算,均衡,归一化,相似度比较等等。为了体验这些函数,做了个小实验,功能是:打开摄像头,鼠标选定一个框,框内图像作为标准图像,计算出其直方图并显示出来;然后继续鼠标选定框,该框内的图像的直方图与标准图像的进行相似度计算,计算结果在终端输出,数值越大表示相似度越大。 工程环境:opencv2.3.1+vs2010。工程代码:1//hist_test.cpp:定义控制台应用程序的入口点。2//34#include"stdafx.h"5#i
2、nclude6#include7#include8#include9#include1011usingnamespacecv;12usingnamespacestd;1314intnFrame_num=0;15boolpause=false;16booltracking=false;17RectpreselectROI,selectROI;//用于存放手选的矩形18bo
3、olcomp=true;1920Matrhist,ghist,bhist;21intchannels[]={0,1,2};22//constinthistsize[]={256,256,256};23constinthistsize[]={16,16,16};24constinthistsize1=16;25floatrranges[]={0,255};26floatgranges[]={0,255};27floatbranges[]={0,255};28floatrange[]={0,255};29constfloat*ranges1={range};//这里的r
4、anges就相当于一个双指针了30constfloat*ranges[]={rranges,granges,branges};//ranges是个双指针,且前面一定要用const,即不可改变常量,提高程序的可读性和稳健性31//constfloat*ranges[]={{0,255},{0,255},{0,255}};3233voidonMouse(intevent,intx,inty,int,void*)34{35if(event==CV_EVENT_LBUTTONDOWN)36{37selectROI.x=x;38selectROI.y=y;39tracking
5、=false;40}41elseif(event==CV_EVENT_LBUTTONUP)42{43selectROI.width=x-selectROI.x;44selectROI.height=y-selectROI.y;45tracking=true;46comp=true;47nFrame_num++;//选定后才算真正意义上的第一帧48if(nFrame_num>=10)nFrame_num=10;//防止nFrame_num溢出49}50}5152intmain(intargc,constchar*argv[])53{54Matframe,img;55M
6、atstaRoiHist;56MatNDRoiHist;57intDRAW_H=400,DRAW_W=400;58Matdraw(DRAW_W,DRAW_H,CV_8UC3,Scalar(0,0,0));//建立一个显示直方图的图片,背景为纯黑色59intDRAW_BIN_W=cvRound(DRAW_W/histsize1);6061/****打开摄像头****/62VideoCapturecam(0);63if(!cam.isOpened())64return-1;6566/****鼠标捕捉****/67namedWindow("camera",1);68nam
7、edWindow("rgb_hist",1);69setMouseCallback("camera",onMouse,0);//这里用的是面向对象的思想,只要有鼠标动作就会调用鼠标响应函数7071while(1)72{73if(!pause)//暂停按钮只需控制视频的读取74{75cam>>frame;76if(frame.empty())77break;//break此处跳出的是while语句,一般是跳出for或while语句,不要理解为跳出if语句78}79/*if(1==nFrame_num)80{8182}*/83if(tracking)84{85Mat