zoukankan      html  css  js  c++  java
  • 直方图反向投影学习-----个人理解(你究竟是不是凶手)

    今天重新学习了一下反向直方图,个人是这样理解的:通过计算模型(现场证据)的图像直方图,再计算待测试(嫌疑人)的图像直方图,然后将嫌疑人的直方图映射到现场证据的直方图中,再将结果显示出来。

     原理可以看一下别人的:https://blog.csdn.net/fengye2two/article/details/79113560

    直方图归一化那么对应的直方图高度就是概率咯,如果你的待测试对象的结果值很大(或者说你的图像更亮),那么说明你是凶手的嫌疑很大!

    不过前提是在手掌局部进行绘制直方图,如果对整个图像绘制直方图,你会发现bin值(横坐标)很小的地方,其值也可能很大,因为图上不仅只有手掌部分,还有其他四个角的地方。

    参考官方文档:

    下面附上可直接运行的代码和测试图片 1 #include <opencv2/opencv.hpp>

    #include <opencv2/opencv.hpp>
    #include <iostream>
    #include <math.h>
    #include <Vector>
    #include <string>
    
    using namespace std;
    using namespace cv;//这句话必须加入,如果不加入,则下面的统一写成cv::
     
    Mat src, hsv, hue, test, test_hue;
    const char* window_image = "input image";
    int bins = 180;
    int main()
    {
        src = imread("d:/img/hand.jpg");
        test = imread("d:/img/hand2.jpg");
        namedWindow(window_image, CV_WINDOW_AUTOSIZE);
        namedWindow("test image", CV_WINDOW_AUTOSIZE);
        namedWindow("BackProject", CV_WINDOW_AUTOSIZE);
        namedWindow("Histogram", CV_WINDOW_AUTOSIZE);//histogram 柱状图
        imshow(window_image, src);
        imshow("test image", test);
    
        //将BGR图像转化为HSV图像
        cvtColor(src, hsv, CV_BGR2HSV);
        hue.create(hsv.size(), hsv.depth());
        int nchannels[] = { 0, 0 };
        mixChannels(&hsv, 1, &hue, 1, nchannels, 1);
    
        //这是待检测图像
        cvtColor(test, test, CV_BGR2HSV);
        test_hue.create(test.size(), test.depth());
        //int nchannels[] = { 0, 0 };
        mixChannels(&test, 1, &test_hue, 1, nchannels, 1);
    
        //计算demo的直方图
        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());
    
        //将test的图像根据h_hist,计算反向直方图结果
        Mat backProjImage;
        calcBackProject(&test_hue, 1, 0, h_hist, backProjImage, &histRanges, 1, true);
        imshow("BackProject", backProjImage);
    
        int hist_h = 400;
        int hist_w = 400;
        Mat histImage;
        histImage.create(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),
                Scalar(0, 0, 255), -1);
        }
        imshow("Histogram", histImage);
    
        imshow(window_image, src);
    
        waitKey(0);
        return 0;
    }

    图片:第一张为demo,第二张为test

    结果:

    以上是个人学习理解,本人也是小白一枚,若大佬们发现有错误,请多多还请多多包涵多多指教!!!

  • 相关阅读:
    NumPy 百题大冲关,冲鸭!
    33 个送给 Java 程序员的练手项目合集
    比特币——带你掌握未来的技术和财富
    HTML5 蔡徐坤打篮球游戏 NMSL❤️❤️❤️
    网络协议基础:“工作中模模糊糊的概念,这次终于理顺了!”
    昨天521表白失败,我想用Python分析一下...表白记录和聊天记录
    有哪些好用不火的软件?
    如何处理负载、高并发?
    怎么实现第三方登录?
    购物车的原理?
  • 原文地址:https://www.cnblogs.com/zhiyonglu/p/10734603.html
Copyright © 2011-2022 走看看