opencv学习日记——图像直方图反向投影

opencv学习日记——图像直方图反向投影

一、图像处理结果

注:中间那个是取的模板
在这里插入图片描述

二、代码部分

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;

void show_hist(Mat hist, string name);
Mat hist(Mat a);
int main()
{
    Mat img = imread("cat.jpg");
    //取出图片的一部分作为模板
    Rect rect(100, 200, 50, 50);
    Mat img3 = img(rect);
    imwrite("sub-cat.jpg", img3);
    
    Mat img1 = imread("sub-cat.jpg");
    if (img.empty() || img1.empty())
    {
        cout << "输入为空";
        return -1;
    }
    imshow("img", img);
    imshow("img1", img1);
    Mat img_HSV, img_HSV1, img_HSV2, sub_HSV, hist, hist2, imgs[3], img0, img2;
    //图像转化成HSV形式
    cvtColor(img, img_HSV, COLOR_BGR2HSV);
    cvtColor(img1, sub_HSV, COLOR_BGR2HSV);
    int h_bins = 32; int s_bins = 32;
    int histSize[] = {h_bins, s_bins};
    float h_ranges[] = {0, 180};
    float s_ranges[] = {0, 256};
    const float* ranges[] = {h_ranges, s_ranges};
    int channels[] = {0, 1};
    //计算直方图
    calcHist(&sub_HSV, 1, channels, Mat(), hist, 2, histSize, ranges, true, false);

    Mat backproj;
    //用模板在原图进行匹配
    //calcBackProject(待匹配图, 几张, 通道索引, 直方图, 生成图像, 个通道取值范围, 尺度)
    calcBackProject(&img_HSV, 1, channels, hist, backproj, ranges, 1.0);
    //匹配后生成的图像
    imshow("反向投影后结果", backproj);
    show_hist(hist, "hist");

    waitKey(0);
    return 0;
}
//可视化直方图
void show_hist(Mat hist, string name)
{
    int hist_w = 512;
    int hist_h = 360;
    int width = 2;
    Mat img3 = Mat::zeros(hist_h, hist_w, CV_8UC1); 
    normalize(hist, hist, 1, 0, NORM_INF, -1, Mat());
    for (int i = 1; i < hist.rows ; i++ )
    {
        rectangle(img3, Point(width * (i - 1), hist_h - 1), Point(width * i - 1, hist_h - cvRound(hist_h * hist.at<float>(i - 1)) - 1), Scalar(255, 255, 255), -1);

    }
    imshow(name, img3);
    
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值