ApplyColorMap doesn't work; effect of pattern matching

There seems to be some influence of the pattern matching code that will prevent me from applying the color map. According to the documentation type

shades of gray or colors don't matter.

Here is my code:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/contrib/contrib.hpp"

#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

/// Global Variables
Mat img;
Mat templ;
Mat result;
const char* image_window = "Source Image";
const char* result_window = "Result window";

int match_method;
int max_Trackbar = 5;

/// Function Headers
void MatchingMethod( int, void* );

int main( int, char** argv )
{
    /// Load image and template
    img = imread( argv[1], 1 );
    templ = imread( argv[2], 1 );

    /// Create windows
    namedWindow( image_window, WINDOW_AUTOSIZE );
    namedWindow( result_window, WINDOW_AUTOSIZE );

    /// Create Trackbar
    const char* trackbar_label = "Method: \n 0: SQDIFF \n 1: SQDIFF NORMED \n 2: TM CCORR \n 3: TM CCORR NORMED \n 4: TM COEFF \n 5: TM COEFF NORMED";
    createTrackbar( trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod );

    MatchingMethod( 0, 0 );

    waitKey(0);
    return 0;
}

void MatchingMethod( int, void* )
{
    /// Source image to display
    Mat img_display;
    img.copyTo( img_display );

    /// Create the result matrix
    int result_cols =  img.cols - templ.cols + 1;
    int result_rows = img.rows - templ.rows + 1;

    result.create( result_rows, result_cols, CV_32FC1 );

    /// Do the Matching and Normalize
    matchTemplate( img, templ, result, match_method );
    normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );

    /// Localizing the best match with minMaxLoc
    double minVal; double maxVal; Point minLoc; Point maxLoc;
    Point matchLoc;

    minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );


    if( match_method  == TM_SQDIFF || match_method == TM_SQDIFF_NORMED )
    { matchLoc = minLoc; }
    else
    { matchLoc = maxLoc; }


    applyColorMap(result, result, COLORMAP_JET);

    /// Show me what we got
    rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(255), 2, 8, 0 );
    rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(255), 2, 8, 0 );

    cout << endl << "Type result: " << result.type() << endl;
    cout << endl << "Type img_display: " << img_display.type() << endl;
    //cout << endl << "Type result: " << result.type() << endl;

    imshow( image_window, img_display );
    imshow( result_window, result );

    return;
}

      

Regarding the documentation ( colormaps ) I don't see what I might have missed. The resulting image is still grayscale.

+3


source to share


2 answers


I had the same problem. I believe the bug was found here and is reported as a bug.

https://github.com/Itseez/opencv/issues/6149



Not sure if it's the same for you, but my matrix was using CV_32C1 and therefore didn't work. When I switched to CV_U8C1 I got at least a color.

+1


source


You need to create a results matrix in a function. This is clearly explained in the documentation. So, you should try something like below.

Mat coloredResult;    
applyColorMap(result, coloredResult , COLORMAP_JET);

      



Hope this helps.

0


source







All Articles