演示代码:
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace std; using namespace cv; Mat src; Mat hsv; Mat hue; int bins = 12; void Hist_And_Backprojection(int, void*); int main(int argc, char** argv) { src = imread("e:/hand.png"); if (src.empty()) { printf("could not load image...\n"); return -1; } const char* window_image = "input image"; namedWindow(window_image, CV_WINDOW_NORMAL); namedWindow("BackProj", CV_WINDOW_NORMAL); namedWindow("Histogram", CV_WINDOW_NORMAL); cvtColor(src, hsv, CV_BGR2HSV); hue.create(hsv.size(), hsv.depth()); int nchannels[] = { 0, 0 }; mixChannels(&hsv, 1, &hue, 1, nchannels, 1); createTrackbar("Histogram Bins:", window_image, &bins, 180, Hist_And_Backprojection); Hist_And_Backprojection(0, 0); imshow(window_image, src); waitKey(0); return 0; } void Hist_And_Backprojection(int, void*) { float range[] = { 0, 180 }; const float* histRanges = { range }; Mat h_hist; calcHist(&hue, 1, 0, Mat(), h_hist, 1, &bins, &histRanges, true, false); normalize(h_hist, h_hist, 0, 255, NORM_MINMAX, -1, Mat()); Mat backPrjImage; calcBackProject(&hue, 1, 0, h_hist, backPrjImage, &histRanges, 1, true); imshow("BackProj", backPrjImage); int hist_h = 400; int hist_w = 400; Mat histImage(hist_w, hist_h, CV_8UC3, Scalar(0, 0, 0)); int bin_w = (hist_w / bins); for (int i = 1; i < bins; i++) { rectangle(histImage, Point((i - 1) * bin_w, (hist_h - cvRound(h_hist.at<float>(i - 1) * (400 / 255)))), //Point(i*bin_w, (hist_h - cvRound(h_hist.at<float>(i) * (400 / 255)))), Point(i * bin_w, hist_h), Scalar(0, 0, 255), -1); } imshow("Histogram", histImage); return; }
代码解释:
反向投影
反向投影是反映直方图模型在目标图像中的分布情况
简单点说就是用直方图模型去目标图像中寻找是否有相似的对象。通常用HSV色彩空间的HS两个通道直方图模型
反向投影 – 步骤
1.建立直方图模型
2.计算待测图像直方图并映射到模型中
3.从模型反向计算生成图像
实现步骤与相关API
加载图片imread
将图像从RGB色彩空间转换到HSV色彩空间cvtColor
计算直方图和归一化calcHist与normalize
Mat与MatND其中Mat表示二维数组,MatND表示三维或者多维数据,此处均可以用Mat表示。
计算反向投影图像 - calcBackProject
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文章代码及资料部分或全部来自贾志刚老师的视频,勇哥只是在个人理解的基础上做学习笔记,转载请附上博文链接!

