Ask Your Question
0

phaseCorrelate fails with Rectangle ROI type of arguments due to their incorrect .type()

asked 2018-04-17 16:27:08 -0600

updated 2018-04-17 21:04:10 -0600

berak gravatar image

Hi, I'm trying to compute phase correlation between two square 256x256 pixel blocks using the code below. Unfortunately, the following ASSERT fails in the phaseCorrelate(): CV_Assert( src1.type() == CV_32FC1 || src1.type() == CV_64FC1 );

Surprisingly, grayRefRoi64f.type() = 22, so that's a reason but I don't understand why and how to fix this problem. Thanks in advance,

AndrewK

interestingly, very similar routine operating on the full size video frame i.e. using fReference and fUnderTest as arguments to phaseCorrelate() works without any problem

Point2d two_ROIblocks_phcorrelation(double* response, Mat& fReference, Mat& fUnderTest)
{
//  fReference.type(); fReference.depth(); fReference.size();
    int block_width = 256;
    int block_height = 256;
//
    Mat grayReference, grayUnderTest, hann;
    Mat grayRefRoi,    grayUTestRoi;
    Mat grayRefRoi64f, grayUTestRoi64f;
//      
    cvtColor(fReference, grayReference, COLOR_RGB2GRAY);
    cvtColor(fUnderTest, grayUnderTest, COLOR_RGB2GRAY);
    Rect refRectangle = Rect((grayReference.size().width - block_width) >> 1, (grayReference.size().height - block_height) >> 1, block_width, block_height);
//draw rectangle on video frame
//  rectangle(fReference, refRectangle, Scalar(255), 1, 8, 0);
    rectangle(fUnderTest, refRectangle, Scalar(255), 1, 8, 0);
//
    grayRefRoi  = fReference(refRectangle);
    grayUTestRoi = fUnderTest(refRectangle);
    createHanningWindow(hann, grayRefRoi.size(), CV_64F);
//
    grayRefRoi.convertTo(grayRefRoi64f, CV_64F);
    grayUTestRoi.convertTo(grayUTestRoi64f, CV_64F);

    //M, N numbers below imply numbers to be used for DFT which are lower than image size and any multiple of 2, 3 and 5 numbers incl. 540x960!
    int M = getOptimalDFTSize(grayUTestRoi.rows);       
    int N = getOptimalDFTSize(grayUTestRoi.cols);
    cout << "PhC ROISize = " << M << "x" << N << endl;

    Point2d shift = { 1, 1 };
    if (grayRefRoi64f.type()    != grayUTestRoi64f.type())                              return shift;
    if (grayRefRoi64f.type()    != CV_64F)                                              return shift;
    cout << "type = " << grayRefRoi64f.type() << endl;
    if (grayRefRoi64f.size      != grayUTestRoi64f.size)                                return shift;

    shift = phaseCorrelate(grayRefRoi64f, grayUTestRoi64f, hann, response);

    return shift;
}
edit retag flag offensive close merge delete

1 answer

Sort by ยป oldest newest most voted
0

answered 2018-04-18 00:22:46 -0600

open_ranger gravatar image

Looks like you should use

grayRefRoi  = grayReference(refRectangle);
edit flag offensive delete link more

Comments

surely, missed pretty obvious, thanks again!

andrew.krupiczka gravatar imageandrew.krupiczka ( 2018-04-18 05:37:43 -0600 )edit

Question Tools

1 follower

Stats

Asked: 2018-04-17 16:27:08 -0600

Seen: 408 times

Last updated: Apr 18 '18