反向投影:OpenCV——反向投影(定位模板图像在输入图像中的位置)-LMLPHP

OpenCV——反向投影(定位模板图像在输入图像中的位置)-LMLPHP

OpenCV——反向投影(定位模板图像在输入图像中的位置)-LMLPHP

OpenCV——反向投影(定位模板图像在输入图像中的位置)-LMLPHP

OpenCV——反向投影(定位模板图像在输入图像中的位置)-LMLPHP

 #include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace std;
#define WINDOW_NAME "效果图" Mat src, hsv, hue;
Mat temp, temp_hsv, temp_hue;
int bin = ;//直方图组距
void on_BinChange(int, void*); int main(int argc, char** argv)
{
src = imread("test.jpg");
temp = imread("temp.jpg");
if (src.empty()|| temp.empty()) {
printf("Could not load image...");
return -;
}
imshow("Input Image",src); //转到HSV空间
cvtColor(src, hsv, COLOR_BGR2HSV);
cvtColor(temp, temp_hsv, COLOR_BGR2HSV); //分离Hue色调通道
hue.create(hsv.size(),hsv.depth());
temp_hue.create(temp_hsv.size(), temp_hsv.depth());
int ch[]= {,};
mixChannels(&hsv, , &hue, , ch, );
mixChannels(&temp_hsv, , &temp_hue, , ch, ); //创建Trackbar来输入bin的数目
namedWindow(WINDOW_NAME,WINDOW_AUTOSIZE);
createTrackbar("色调组距", WINDOW_NAME,&bin,, on_BinChange); //进行一次初始化
on_BinChange(, ); imshow(WINDOW_NAME, src); waitKey();
return ;
} void on_BinChange(int, void*)
{
//参数准备
MatND hist;
int histSize = max(bin, );
float hue_range[] = { , };//h通道的取值范围
const float* ranges = {hue_range}; //计算直方图并归一化
//calcHist(&hue, 1, 0, Mat(), hist, 1, &histSize, &ranges, true, false);
//normalize(hist,hist,0,255,NORM_MINMAX,-1,Mat());
calcHist(&temp_hue, , , Mat(), hist, , &histSize, &ranges, true, false);
normalize(hist, hist, , , NORM_MINMAX, -, Mat()); //计算反向投影
MatND backproj;
calcBackProject(&hue,,,hist,backproj,&ranges,,true); imshow("反向投影图", backproj); //绘制直方图参数准备
int w = , h = ;
int bin_w = cvRound((double)w/histSize);
Mat histImg = Mat::zeros(w,h,CV_8UC3); //绘制直方图
for(int i=;i<bin;i++)
{
rectangle(histImg, Point(i*bin_w,h),Point((i+)*bin_w,h-cvRound(hist.at<float>(i)*h/255.0)),Scalar(,,),-);
} imshow("直方图",histImg); }

直方图反向投影可以在“输入图像”中 找到和“模板”直方图特征相似的部分。

05-11 11:04