OpenCV实现图像反向投影
一、概述
概念:反向投影是反应直方图模型在目标图像中的分布情况。简单点来说就是用直方图模型去目标图像中寻找是否有相似的对象。
ps:所以这里需要有两个输入:1.模型图片 。2.场景图片 ,即利用模型图片直方图去场景图片中搜索。
calcBackProject( const Mat* images,//const Mat类型的images,输入的数组(或数组集),它们需为相同的深度(CV_8U或CV_32F)和相同的尺寸,而通道数可以任意 int nimages,//int类型的nimages,输入数组的个数,也就是第一个参数中存放了多少张图像,有几个源数组 const int* channels,//const int类型的channels,需要统计的通道索引。第一个数组通道从0到image[0].channels-1,第二个数组通道从images[0].channes()计算到images[0].channels()+images[1].channels()-1 InputArray hist,//InputArray类型的hist,输入的直方图 OutputArray backProject,//OutputArray类型的backProject,目标反向投影阵列,其须为单通道,并且和image[0]有相同的大小和深度 const float** ranges,//const float**类型的ranges,表示每一个维度数组(第六个参数dims)的每一维边界阵列,可以理解为每一维数值的取值范围 double scale=1,//double scale,有默认值1,输出的方向投影可选的缩放因子,默认值为1 bool uniform=true//boo类型的uniform,指示直方图是否均匀的标识符,有默认值true );
操作步骤:
1.载入模型图及场景图
2.将模型图和场景图转换为HSV色彩空间
3.计算模型图直方图
4.模型直方图归一化
5.执行反向投影
6.输出图像
二、代码示例
//[1]载入模型图片及场景图片 Mat src = imread(filePath); Mat src_roi=imread("C:\\Users\\wei.yang\\Downloads\\opencv_res\\highway_hue.jpg"); if(src.empty()){ return; } imshow("src",src); //[2]将模型图片和场景图片转换为HSV色彩空间 Mat src_hsv,src_hsv_roi; cvtColor(src, src_hsv, COLOR_BGR2HSV); cvtColor(src_roi, src_hsv_roi, COLOR_BGR2HSV); //【3】计算模型图直方图 MatND roiHist; //直方图对象 int dims = 2; //特征数目(直方图维度) float hranges[] = { 0,180 }; //特征空间的取值范围 float Sranges[] = { 0,256 }; const float *ranges[] = { hranges,Sranges }; int size[] = { 20,32 }; //存放每个维度的直方图的尺寸的数组 int channels[] = {0,1}; //通道数 calcHist(&src_hsv_roi,1, channels, Mat(), roiHist, dims, size, ranges); //【4】直方图归一化 normalize(roiHist, roiHist, 0, 255, NORM_MINMAX); //【5】反向投影 Mat proImage; //投影输出图像 calcBackProject(&src_hsv, 1, channels, roiHist, proImage, ranges); imshow("proImage",proImage);
三、示例图片
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探