/*******************************************************
测试程序【反投影】
时间:2016年9月3日
********************************************************/
Mat src; Mat hsv; Mat hue;
int bins = 25; //Hue 通道数【默认25】
void Hist_and_Backproj(int, void* );
int main(void)
{
//【1、读入——BGR2HSV——】
src = imread("hand_sample1.jpg", 1 );
cvtColor( src, hsv, COLOR_BGR2HSV );
//【2、拷贝,HSV的hue值】 Use only the Hue value
hue.create( hsv.size(), hsv.depth() );
int ch[] = { 0, 0 };
//复制输入数组的所选通道——>输出数组的所选通道
//src,源数组个数,dst,目标数组个数, 序号对数组【通道如何被复制】,序号对个数
mixChannels( &hsv, 1, &hue, 1, ch, 1 );
//【滚动条控制 (hue 通道数) 】 Create Trackbar to enter the number of bins
const char* window_image = "Source image";
namedWindow( window_image, WINDOW_AUTOSIZE );
createTrackbar("* Hue bins: ", window_image, &bins, 180, Hist_and_Backproj );
Hist_and_Backproj(0, 0);
imshow( window_image, src );
waitKey(0);
return 0;
}
// @function Hist_and_Backproj
// @brief Callback to Trackbar
void Hist_and_Backproj(int, void* )
{
MatND hist; //多维Mat
int histSize = MAX( bins, 2 ); //直方图通道数>=2
float hue_range[] = { 0, 180 }; //直方图范围
const float* ranges = { hue_range }; //作为参数的转换
//【1、获取直方图&归一化】【hue——>hist】
calcHist( &hue, 1, 0, Mat(), hist, 1, &histSize, &ranges, true, false );
normalize( hist, hist, 0, 255, NORM_MINMAX, -1, Mat() );
//【2、获取反投影】【hue+hist——>backproj】
MatND backproj;
calcBackProject( &hue, 1, 0, hist, backproj, &ranges, 1, true );
//【3、绘图——BackProj】
imshow( "BackProj", backproj );
//【绘制直方图——histImg】
int w = 400; int h = 400;
int bin_w = cvRound( (double) w / histSize );
Mat histImg = Mat::zeros( w, h, CV_8UC3 );
for( int i = 0; i < bins; i ++ )
{ rectangle( histImg, Point( i*bin_w, h ), Point( (i+1)*bin_w, h - cvRound( hist.at<float>(i)*h/255.0 ) ), Scalar( 0, 0, 255 ), -1 ); }
imshow( "Histogram", histImg );
}
【opencv练习30 - 反投影】
最新推荐文章于 2024-05-13 23:30:01 发布