【opencv练习30 - 反投影】

/*******************************************************
    测试程序【反投影】
    时间: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 );

}

这里写图片描述

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值