反向投影的工作原理
反向投影图中,某一位置(x,y)的像素值 = 原图对应位置(x,y)像素值在原图的总数目。 即若原图中(5,5)位置上像素值为 200,而原图中像素值为 200 的像素点有 500 个,则反向投影图中(5,5)位置上的像素值就设为 500。
具体步骤:
反向投影的作用
反向投影用于在输入图像(通常较大)中查找与模板图像(通常较小甚至仅 1 个像素)最匹配的点或区域,也就是确定模板图像在输入图像中的位置。
计算反向投影:calcBackProject 函数
void calcBackProject(const Mat* images, int nimages, const int* channels, InputArray hist, OutputArray backProject, const float** ranges, double scale = 1, bool uniform = true);
代码示例:
#include<opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
Mat src, hsvImg, hist;
vector<Mat>hsv;
int histSize = 5;
void ChangeHistSize(int, void*) {
if (histSize == 0) {
histSize = 1;
}
//计算 H 通道直方图 https://www.cnblogs.com/bjxqmy/p/12378312.html
int channels[] = { 0 };
float hr[] = { 0,180 };
const float *ranges[] = { hr };
calcHist(&hsv[0], 1, &channels[0], Mat(), hist, 1, &histSize, &ranges[0]);
normalize(hist, hist, 255, 0, NORM_L1);
imshow("hist", hist);
//计算反向投影
Mat backImg;
calcBackProject(&src, 1, &channels[0], hist, backImg, &ranges[0], 1);
imshow("backImg", backImg);
}
int main() {
src = imread("C:/Users/齐明洋/Desktop/证件照/1.jpg");
imshow("src", src);
//转换为 HSV 通道图像
cvtColor(src, hsvImg, COLOR_BGR2HSV);
imshow("hsvImg", hsvImg);
//通道分离
split(hsvImg, hsv);
imshow("hImg", hsv[0]);
namedWindow("backImg");
createTrackbar("histSize", "backImg", &histSize, 180, ChangeHistSize);
ChangeHistSize(0, 0);
waitKey(0);
}
效果演示:
借鉴博客:https://blog.csdn.net/fengye2two/article/details/79113560
opencv —— calcBackProject 反向投影
原文:https://www.cnblogs.com/bjxqmy/p/12452420.html