Search code examples
c++opencvdct

error in implementation of dct in opencv


why the following errors occur when i try to implement dct in opencv?

Assertion failed (type == CV_32FC1 || type == CV_64FC1) in dct,

here is the code:

#include <cv.h>
#include "opencv2/imgproc/imgproc.hpp"
#include <highgui.h>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
    Mat image,dimage(image);
       image = imread( "lena.jpg", 1 );

      if( !image.data )
        {
          printf( "No image data \n" );
           return -1;
         }

        namedWindow( "Display Image", CV_WINDOW_AUTOSIZE );
        imshow( "Display Image", image );
        dimage=Mat::zeros(image.rows,image.cols,CV_32F);
        dct(image, dimage, DCT_INVERSE == 0 );

        namedWindow( "DCT Image", CV_WINDOW_AUTOSIZE );
        imshow( "DCT image", dimage );
        waitKey(0);

       return 0;
}

Solution

  • you have to convert your image from uchar to float first (and maybe back to uchar later):

    // also please use the c++ headers, not the old c-ones !
    
    #include "opencv2/core/core.hpp" 
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/highgui/highgui.hpp"
    
    Mat image = imread( "lena.jpg", 0 ); // grayscale
    
    Mat fimage;
    image.convertTo(fimage, CV_32F, 1.0/255); // also scale to [0..1] range (not mandatory)
    
    // you're lucky with lena (512x512), for odd sizes, you have to 
    // pad it to pow2 size, or use dft() instead:
    Mat dimage;
    dct( fimage, dimage ); 
    // process dimage,
    // then same way back:
    dct( dimage, dimage, DCT_INVERSE );
    dimage.convertTo(image, CV_8U); // maybe scale back to [0..255] range (depending on your processing)
    
    imshow("result",image);
    waitKey();