2

現在、OpenCV と C++ を使用してローカル バイナリ パターンを実装する方法を探しています。

現在、私はこれを見つけました: https://github.com/bytefish/opencv/tree/master/lbp

ただし、2 つの画像または LBP ヒストグラムを互いに比較し、類似性指標を与える必要があります。

これが私の変更されたコードです:

    #include <opencv/cv.h>
#include <opencv/highgui.h>
#include "lbp.hpp"
#include "histogram.hpp"

using namespace cv;

int main(int argc, const char *argv[]) {
    int deviceId = 0;
    if(argc > 1)
        deviceId = atoi(argv[1]);

    VideoCapture cap(deviceId);

    if(!cap.isOpened()) {
        cerr << "Capture Device ID " << deviceId << "cannot be opened." << endl;
        return -1;
    }

    // initial values
    int radius = 1;
    int neighbors = 8;

    // windows
    namedWindow("original",CV_WINDOW_AUTOSIZE);
    namedWindow("lbp",CV_WINDOW_AUTOSIZE);

    // matrices used
    Mat test;
    Mat test1;
    Mat frame; // always references the last frame
    Mat dst; // image after preprocessing
    Mat dst1;
    Mat lbp; // lbp image
    Mat lbp1;

    // just to switch between possible lbp operators
    vector<string> lbp_names;
    lbp_names.push_back("Extended LBP"); // 0
    lbp_names.push_back("Fixed Sampling LBP"); // 1
    lbp_names.push_back("Variance-based LBP"); // 2
    int lbp_operator=1;

    bool running=true;
    while(running) {
        //cap >> frame;
        dst = imread("Coin1.jpg", CV_LOAD_IMAGE_GRAYSCALE); //Known Image
        dst1 = imread("Coin2.jpg", CV_LOAD_IMAGE_GRAYSCALE); //Compared to

        switch(lbp_operator) {
        case 0:
            lbp::ELBP(test, lbp, radius, neighbors); // use the extended operator
            break;
        case 1:
            lbp::OLBP(dst, lbp); // use the original operator
            lbp::OLBP(dst1, lbp1); // use the original operator
            break;
        case 2:
            lbp::VARLBP(dst, lbp, radius, neighbors);
            break;
        }
        // now to show the patterns a normalization is necessary
        // a simple min-max norm will do the job...
        normalize(lbp, lbp, 0, 255, NORM_MINMAX, CV_8UC1);

        Mat lbp_hist, lbp1_hist;
        int histSize[] = {256};
        float s_ranges[] = { 0, 256 };
        const float* ranges[] = { s_ranges };

    // Use the o-th and 1-st channels
    int channels[] = { 0 };

        calcHist( &lbp, 1, channels, Mat(), lbp_hist, 1, histSize, ranges, true, false );
        normalize( lbp1_hist, lbp1_hist, 0, 1, NORM_MINMAX, -1, Mat() );

        calcHist( &lbp1, 1, channels, Mat(), lbp1_hist, 1, histSize, ranges, true, false );
        normalize( lbp_hist, lbp_hist, 0, 1, NORM_MINMAX, -1, Mat() );

        double base_base = compareHist( lbp_hist, lbp1_hist, 0 );
        printf("%f\n",base_base); //get a similarity

        //imshow("original", lbp);
        //imshow("lbp", lbp1);
        imshow("1", lbp_hist);
        imshow("2", lbp1_hist);

        char key = (char) waitKey(0);;

    }
        return 0; // success
}

ただし、正しく機能しているとは思いません。正確なヒストグラムが得られません。だから比較できない。 スクリーンショット

助けてください。

4

1 に答える 1