Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 开Cv相位相关_Image Processing_Opencv_Signal Processing - Fatal编程技术网

Image processing 开Cv相位相关

Image processing 开Cv相位相关,image-processing,opencv,signal-processing,Image Processing,Opencv,Signal Processing,我想计算OpenCV中函数的相位相关性。我已经找到了一些其他的库,我想用OpenCV来实现它 我的问题是不同的,因为我想计算两个阵列的相位相关性,都是360个元素。 我试图从文档中评估如何做到这一点,但我不知道我的方法是否好。 我的R矩阵没有规范化,如何规范化它,有必要吗? 如果你给我举一些例子,我将不胜感激。 我执行此任务的职能: void calcPhaseCorrelation(int* x1, int* x2){ Mat array1 = Mat(1,360,DataType&l

我想计算OpenCV中函数的相位相关性。我已经找到了一些其他的库,我想用OpenCV来实现它

我的问题是不同的,因为我想计算两个阵列的相位相关性,都是360个元素。 我试图从文档中评估如何做到这一点,但我不知道我的方法是否好。 我的R矩阵没有规范化,如何规范化它,有必要吗? 如果你给我举一些例子,我将不胜感激。 我执行此任务的职能:

void calcPhaseCorrelation(int* x1, int* x2){
    Mat array1 = Mat(1,360,DataType<float>::type); 
    Mat array2 = Mat(1,360,DataType<float>::type);

    uchar* begin = array1.data;
    uchar* end = begin + (array1.step.p[0]/ sizeof(float)) * array1.size().height;
    uchar *ptr = begin;

    int ctr1 = 0, ctr2 = 0; //control in loops
    while(ptr<end)
    {
       *ptr = (float)x1[ctr1];
       ctr1++;
       ptr++;
    }

    begin = array2.data;
    end = begin + (array2.step.p[0]/ sizeof(float)) * array2.size().height;
    ptr = begin;
    while(ptr<end)
    {
        *ptr = x2[ctr2];
        ctr2++;
        ptr++;
    }

    Mat outputArray;
    outputArray.create(abs(array1.rows - array2.rows)+1, 
        abs(array1.cols - array2.cols)+1, array1.type());
    Size dftSize;
    dftSize.width = getOptimalDFTSize(array1.cols + array2.cols - 1);
    dftSize.height = getOptimalDFTSize(array1.rows + array2.rows - 1);

    Mat resultA(dftSize, array1.type(), Scalar::all(0));
    Mat resultB(dftSize, array2.type(), Scalar::all(0));
    dft(array1,resultA);
    dft(array2,resultB);

    Mat R;
    mulSpectrums(resultA,resultB,R,DFT_ROWS,true);
    Mat NormR;
normalize(R,NormR);
    idft(NormR,outputArray);
    double minVal, maxVal;
    Point minLoc, maxLoc;
    minMaxLoc(outputArray,&minVal,&maxVal,&minLoc,&maxLoc);

    std::cout<<"Min value: "<<minVal<<", max value: "<<maxVal<<std::endl;
    std::cout<<"Min loc x: "<<minLoc.x<<", min loc y: "<<minLoc.y<<std::endl;
    std::cout<<"Max loc x: "<<maxLoc.x<<", max loc y: "<<maxLoc.y<<std::endl;
}
void calcPhaseCorrelation(int*x1,int*x2){
Mat array1=Mat(1360,数据类型::type);
Mat array2=Mat(1360,数据类型::类型);
uchar*begin=array1.data;
uchar*end=begin+(array1.step.p[0]/sizeof(float))*array1.size().height;
uchar*ptr=开始;
int ctr1=0,ctr2=0;//循环中的控件

虽然(ptr我实际上已经为OpenCV实现了这个方法,但不幸的是,在这个阶段,它只在SVN主干中实现

是一个使用新方法的样本

如果你想参考我的实现,你可以找到它

此外,这是使用它的另一个示例的测试用例

如果您想使用后备箱,您可以通过以下方式获得后备箱:

svn co https://code.ros.org/svn/opencv/trunk/opencv opencv-trunk
是针对Linux的CMake构建指南。是针对Windows的构建指南

编辑: 有补丁给你:)

我在我的代码中也发现了一些错误,所以现在应该纠正它们。它现在还应该支持一维相位相关。我还发现
cv::sqrt()
函数存在问题,导致一些-nan出现,即使
std::sqrt()
没有。我猜这可能是OpenCV的一个bug,也可能只是一个准确性问题。不过,我还没有深入研究它以找出答案

不幸的是,您不能仅仅使用
svn update
来获取我的最新更改,因为我必须等待OpenCV开发人员应用此修补程序。因此,您不必等待,这里有一个修补程序,您可以应用于
$(OpenCV\u SRC)/modules/imgproc/src/phasecorr.cpp
文件。将此文件另存为类似于
phasecorr.patch
的文件,并将其放在OpenCV源目录的根目录中。这是一个简短的陆龟指南,用于在源树中创建/应用补丁

Index: modules/imgproc/src/phasecorr.cpp
===================================================================
--- modules/imgproc/src/phasecorr.cpp   (revision 6971)
+++ modules/imgproc/src/phasecorr.cpp   (working copy)
@@ -83,8 +83,8 @@

                 for( j = 1; j <= rows - 2; j += 2 )
                 {
-                    dataDst[j*stepDst] = (float)((double)dataSrc[j*stepSrc]*dataSrc[j*stepSrc] +
-                                         (double)dataSrc[(j+1)*stepSrc]*dataSrc[(j+1)*stepSrc]);
+                    dataDst[j*stepDst] = (float)std::sqrt((double)dataSrc[j*stepSrc]*dataSrc[j*stepSrc] +
+                                                          (double)dataSrc[(j+1)*stepSrc]*dataSrc[(j+1)*stepSrc]);
                 }

                 if( k == 1 )
@@ -103,7 +103,7 @@

             for( j = j0; j < j1; j += 2 )
             {
-                dataDst[j] = (float)((double)dataSrc[j]*dataSrc[j] + (double)dataSrc[j+1]*dataSrc[j+1]);
+                dataDst[j] = (float)std::sqrt((double)dataSrc[j]*dataSrc[j] + (double)dataSrc[j+1]*dataSrc[j+1]);
             }
         }
     }
@@ -127,8 +127,8 @@

                 for( j = 1; j <= rows - 2; j += 2 )
                 {
-                    dataDst[j*stepDst] = dataSrc[j*stepSrc]*dataSrc[j*stepSrc] +
-                                         dataSrc[(j+1)*stepSrc]*dataSrc[(j+1)*stepSrc];
+                    dataDst[j*stepDst] = std::sqrt(dataSrc[j*stepSrc]*dataSrc[j*stepSrc] +
+                                                   dataSrc[(j+1)*stepSrc]*dataSrc[(j+1)*stepSrc]);
                 }

                 if( k == 1 )
@@ -147,13 +147,10 @@

             for( j = j0; j < j1; j += 2 )
             {
-                dataDst[j] = dataSrc[j]*dataSrc[j] + dataSrc[j+1]*dataSrc[j+1];
+                dataDst[j] = std::sqrt(dataSrc[j]*dataSrc[j] + dataSrc[j+1]*dataSrc[j+1]);
             }
         }
     }
-
-    // do batch sqrt to use SSE optimizations...
-    cv::sqrt(dst, dst);
 }

 static void divSpectrums( InputArray _srcA, InputArray _srcB, OutputArray _dst, int flags, bool conjB)
@@ -196,9 +193,9 @@
             {
                 if( k == 1 )
                     dataA += cols - 1, dataB += cols - 1, dataC += cols - 1;
-                dataC[0] = dataA[0] / dataB[0];
+                dataC[0] = dataA[0] / (dataB[0] + eps);
                 if( rows % 2 == 0 )
-                    dataC[(rows-1)*stepC] = dataA[(rows-1)*stepA] / dataB[(rows-1)*stepB];
+                    dataC[(rows-1)*stepC] = dataA[(rows-1)*stepA] / (dataB[(rows-1)*stepB] + eps);
                 if( !conjB )
                     for( j = 1; j <= rows - 2; j += 2 )
                     {
@@ -239,9 +236,9 @@
         {
             if( is_1d && cn == 1 )
             {
-                dataC[0] = dataA[0] / dataB[0];
+                dataC[0] = dataA[0] / (dataB[0] + eps);
                 if( cols % 2 == 0 )
-                    dataC[j1] = dataA[j1] / dataB[j1];
+                    dataC[j1] = dataA[j1] / (dataB[j1] + eps);
             }

             if( !conjB )
@@ -281,9 +278,9 @@
             {
                 if( k == 1 )
                     dataA += cols - 1, dataB += cols - 1, dataC += cols - 1;
-                dataC[0] = dataA[0] / dataB[0];
+                dataC[0] = dataA[0] / (dataB[0] + eps);
                 if( rows % 2 == 0 )
-                    dataC[(rows-1)*stepC] = dataA[(rows-1)*stepA] / dataB[(rows-1)*stepB];
+                    dataC[(rows-1)*stepC] = dataA[(rows-1)*stepA] / (dataB[(rows-1)*stepB] + eps);
                 if( !conjB )
                     for( j = 1; j <= rows - 2; j += 2 )
                     {
@@ -323,9 +320,9 @@
         {
             if( is_1d && cn == 1 )
             {
-                dataC[0] = dataA[0] / dataB[0];
+                dataC[0] = dataA[0] / (dataB[0] + eps);
                 if( cols % 2 == 0 )
-                    dataC[j1] = dataA[j1] / dataB[j1];
+                    dataC[j1] = dataA[j1] / (dataB[j1] + eps);
             }

             if( !conjB )
@@ -354,31 +351,57 @@
 static void fftShift(InputOutputArray _out)
 {
     Mat out = _out.getMat();
-    
+
+    if(out.rows == 1 && out.cols == 1)
+    {
+        // trivially shifted.
+        return;
+    }
+
     vector<Mat> planes;
     split(out, planes);
-    
+
     int xMid = out.cols >> 1;
     int yMid = out.rows >> 1;
-    
-    for(size_t i = 0; i < planes.size(); i++)
+
+    bool is_1d = xMid == 0 || yMid == 0;
+
+    if(is_1d)
     {
-        // perform quadrant swaps...
-        Mat tmp;
-        Mat q0(planes[i], Rect(0,    0,    xMid, yMid));
-        Mat q1(planes[i], Rect(xMid, 0,    xMid, yMid));
-        Mat q2(planes[i], Rect(0,    yMid, xMid, yMid));
-        Mat q3(planes[i], Rect(xMid, yMid, xMid, yMid));
-        
-        q0.copyTo(tmp);
-        q3.copyTo(q0);
-        tmp.copyTo(q3);
-        
-        q1.copyTo(tmp);
-        q2.copyTo(q1);
-        tmp.copyTo(q2);
+        xMid = xMid + yMid;
+
+        for(size_t i = 0; i < planes.size(); i++)
+        {
+            Mat tmp;
+            Mat half0(planes[i], Rect(0, 0, xMid, 1));
+            Mat half1(planes[i], Rect(xMid, 0, xMid, 1));
+
+            half0.copyTo(tmp);
+            half1.copyTo(half0);
+            tmp.copyTo(half1);
+        }
     }
-    
+    else
+    {
+        for(size_t i = 0; i < planes.size(); i++)
+        {
+            // perform quadrant swaps...
+            Mat tmp;
+            Mat q0(planes[i], Rect(0,    0,    xMid, yMid));
+            Mat q1(planes[i], Rect(xMid, 0,    xMid, yMid));
+            Mat q2(planes[i], Rect(0,    yMid, xMid, yMid));
+            Mat q3(planes[i], Rect(xMid, yMid, xMid, yMid));
+
+            q0.copyTo(tmp);
+            q3.copyTo(q0);
+            tmp.copyTo(q3);
+
+            q1.copyTo(tmp);
+            q2.copyTo(q1);
+            tmp.copyTo(q2);
+        }
+    }
+
     merge(planes, out);
 }

@@ -548,38 +571,67 @@
     int rows = dst.rows;
     int cols = dst.cols;

+    bool is_1d = rows == 1 || cols == 1;
+
+    if(is_1d)
+    {
+        cols = cols + rows - 1;
+    }
+
     if(dst.depth() == CV_32F)
     {
         float* dstData = (float*)dst.data;

-        for(int i = 0; i < rows; i++)
+        if(is_1d)
         {
-            double wr = 0.5 * (1.0f - cos(2.0f * CV_PI * (double)i / (double)(rows - 1)));
-            for(int j = 0; j < cols; j++)
+            for(int i = 0; i < cols; i++)
             {
-                double wc = 0.5 * (1.0f - cos(2.0f * CV_PI * (double)j / (double)(cols - 1)));
-                dstData[i*cols + j] = (float)(wr * wc);
+                double w = 0.5 * (1.0f - cos(2.0f * CV_PI * (double)i / (double)(cols - 1)));
+                dstData[i] = (float)w;
             }
         }
+        else
+        {
+            for(int i = 0; i < rows; i++)
+            {
+                double wr = 0.5 * (1.0f - cos(2.0f * CV_PI * (double)i / (double)(rows - 1)));
+                for(int j = 0; j < cols; j++)
+                {
+                    double wc = 0.5 * (1.0f - cos(2.0f * CV_PI * (double)j / (double)(cols - 1)));
+                    dstData[i*cols + j] = (float)(wr * wc);
+                }
+            }

-        // perform batch sqrt for SSE performance gains
-        cv::sqrt(dst, dst);
+            // perform batch sqrt for SSE performance gains
+            cv::sqrt(dst, dst);
+        }
     }
     else
     {
         double* dstData = (double*)dst.data;

-        for(int i = 0; i < rows; i++)
+        if(is_1d)
         {
-            double wr = 0.5 * (1.0 - cos(2.0 * CV_PI * (double)i / (double)(rows - 1)));
-            for(int j = 0; j < cols; j++)
+            for(int i = 0; i < cols; i++)
             {
-                double wc = 0.5 * (1.0 - cos(2.0 * CV_PI * (double)j / (double)(cols - 1)));
-                dstData[i*cols + j] = wr * wc;
+                double w = 0.5 * (1.0f - cos(2.0f * CV_PI * (double)i / (double)(cols - 1)));
+                dstData[i] = w;
             }
         }
+        else
+        {
+            for(int i = 0; i < rows; i++)
+            {
+                double wr = 0.5 * (1.0 - cos(2.0 * CV_PI * (double)i / (double)(rows - 1)));
+                for(int j = 0; j < cols; j++)
+                {
+                    double wc = 0.5 * (1.0 - cos(2.0 * CV_PI * (double)j / (double)(cols - 1)));
+                    dstData[i*cols + j] = wr * wc;
+                }
+            }

-        // perform batch sqrt for SSE performance gains
-        cv::sqrt(dst, dst);
+            // perform batch sqrt for SSE performance gains
+            cv::sqrt(dst, dst);
+        }
     }
 }
索引:modules/imgproc/src/phasecorr.cpp
===================================================================
---模块/imgproc/src/phasecorr.cpp(版本6971)
+++模块/imgproc/src/phasecorr.cpp(工作副本)
@@ -83,8 +83,8 @@
对于(j=1;j1;
-    
-对于(size_t i=0;iIndex: modules/imgproc/src/phasecorr.cpp
===================================================================
--- modules/imgproc/src/phasecorr.cpp   (revision 6971)
+++ modules/imgproc/src/phasecorr.cpp   (working copy)
@@ -83,8 +83,8 @@

                 for( j = 1; j <= rows - 2; j += 2 )
                 {
-                    dataDst[j*stepDst] = (float)((double)dataSrc[j*stepSrc]*dataSrc[j*stepSrc] +
-                                         (double)dataSrc[(j+1)*stepSrc]*dataSrc[(j+1)*stepSrc]);
+                    dataDst[j*stepDst] = (float)std::sqrt((double)dataSrc[j*stepSrc]*dataSrc[j*stepSrc] +
+                                                          (double)dataSrc[(j+1)*stepSrc]*dataSrc[(j+1)*stepSrc]);
                 }

                 if( k == 1 )
@@ -103,7 +103,7 @@

             for( j = j0; j < j1; j += 2 )
             {
-                dataDst[j] = (float)((double)dataSrc[j]*dataSrc[j] + (double)dataSrc[j+1]*dataSrc[j+1]);
+                dataDst[j] = (float)std::sqrt((double)dataSrc[j]*dataSrc[j] + (double)dataSrc[j+1]*dataSrc[j+1]);
             }
         }
     }
@@ -127,8 +127,8 @@

                 for( j = 1; j <= rows - 2; j += 2 )
                 {
-                    dataDst[j*stepDst] = dataSrc[j*stepSrc]*dataSrc[j*stepSrc] +
-                                         dataSrc[(j+1)*stepSrc]*dataSrc[(j+1)*stepSrc];
+                    dataDst[j*stepDst] = std::sqrt(dataSrc[j*stepSrc]*dataSrc[j*stepSrc] +
+                                                   dataSrc[(j+1)*stepSrc]*dataSrc[(j+1)*stepSrc]);
                 }

                 if( k == 1 )
@@ -147,13 +147,10 @@

             for( j = j0; j < j1; j += 2 )
             {
-                dataDst[j] = dataSrc[j]*dataSrc[j] + dataSrc[j+1]*dataSrc[j+1];
+                dataDst[j] = std::sqrt(dataSrc[j]*dataSrc[j] + dataSrc[j+1]*dataSrc[j+1]);
             }
         }
     }
-
-    // do batch sqrt to use SSE optimizations...
-    cv::sqrt(dst, dst);
 }

 static void divSpectrums( InputArray _srcA, InputArray _srcB, OutputArray _dst, int flags, bool conjB)
@@ -196,9 +193,9 @@
             {
                 if( k == 1 )
                     dataA += cols - 1, dataB += cols - 1, dataC += cols - 1;
-                dataC[0] = dataA[0] / dataB[0];
+                dataC[0] = dataA[0] / (dataB[0] + eps);
                 if( rows % 2 == 0 )
-                    dataC[(rows-1)*stepC] = dataA[(rows-1)*stepA] / dataB[(rows-1)*stepB];
+                    dataC[(rows-1)*stepC] = dataA[(rows-1)*stepA] / (dataB[(rows-1)*stepB] + eps);
                 if( !conjB )
                     for( j = 1; j <= rows - 2; j += 2 )
                     {
@@ -239,9 +236,9 @@
         {
             if( is_1d && cn == 1 )
             {
-                dataC[0] = dataA[0] / dataB[0];
+                dataC[0] = dataA[0] / (dataB[0] + eps);
                 if( cols % 2 == 0 )
-                    dataC[j1] = dataA[j1] / dataB[j1];
+                    dataC[j1] = dataA[j1] / (dataB[j1] + eps);
             }

             if( !conjB )
@@ -281,9 +278,9 @@
             {
                 if( k == 1 )
                     dataA += cols - 1, dataB += cols - 1, dataC += cols - 1;
-                dataC[0] = dataA[0] / dataB[0];
+                dataC[0] = dataA[0] / (dataB[0] + eps);
                 if( rows % 2 == 0 )
-                    dataC[(rows-1)*stepC] = dataA[(rows-1)*stepA] / dataB[(rows-1)*stepB];
+                    dataC[(rows-1)*stepC] = dataA[(rows-1)*stepA] / (dataB[(rows-1)*stepB] + eps);
                 if( !conjB )
                     for( j = 1; j <= rows - 2; j += 2 )
                     {
@@ -323,9 +320,9 @@
         {
             if( is_1d && cn == 1 )
             {
-                dataC[0] = dataA[0] / dataB[0];
+                dataC[0] = dataA[0] / (dataB[0] + eps);
                 if( cols % 2 == 0 )
-                    dataC[j1] = dataA[j1] / dataB[j1];
+                    dataC[j1] = dataA[j1] / (dataB[j1] + eps);
             }

             if( !conjB )
@@ -354,31 +351,57 @@
 static void fftShift(InputOutputArray _out)
 {
     Mat out = _out.getMat();
-    
+
+    if(out.rows == 1 && out.cols == 1)
+    {
+        // trivially shifted.
+        return;
+    }
+
     vector<Mat> planes;
     split(out, planes);
-    
+
     int xMid = out.cols >> 1;
     int yMid = out.rows >> 1;
-    
-    for(size_t i = 0; i < planes.size(); i++)
+
+    bool is_1d = xMid == 0 || yMid == 0;
+
+    if(is_1d)
     {
-        // perform quadrant swaps...
-        Mat tmp;
-        Mat q0(planes[i], Rect(0,    0,    xMid, yMid));
-        Mat q1(planes[i], Rect(xMid, 0,    xMid, yMid));
-        Mat q2(planes[i], Rect(0,    yMid, xMid, yMid));
-        Mat q3(planes[i], Rect(xMid, yMid, xMid, yMid));
-        
-        q0.copyTo(tmp);
-        q3.copyTo(q0);
-        tmp.copyTo(q3);
-        
-        q1.copyTo(tmp);
-        q2.copyTo(q1);
-        tmp.copyTo(q2);
+        xMid = xMid + yMid;
+
+        for(size_t i = 0; i < planes.size(); i++)
+        {
+            Mat tmp;
+            Mat half0(planes[i], Rect(0, 0, xMid, 1));
+            Mat half1(planes[i], Rect(xMid, 0, xMid, 1));
+
+            half0.copyTo(tmp);
+            half1.copyTo(half0);
+            tmp.copyTo(half1);
+        }
     }
-    
+    else
+    {
+        for(size_t i = 0; i < planes.size(); i++)
+        {
+            // perform quadrant swaps...
+            Mat tmp;
+            Mat q0(planes[i], Rect(0,    0,    xMid, yMid));
+            Mat q1(planes[i], Rect(xMid, 0,    xMid, yMid));
+            Mat q2(planes[i], Rect(0,    yMid, xMid, yMid));
+            Mat q3(planes[i], Rect(xMid, yMid, xMid, yMid));
+
+            q0.copyTo(tmp);
+            q3.copyTo(q0);
+            tmp.copyTo(q3);
+
+            q1.copyTo(tmp);
+            q2.copyTo(q1);
+            tmp.copyTo(q2);
+        }
+    }
+
     merge(planes, out);
 }

@@ -548,38 +571,67 @@
     int rows = dst.rows;
     int cols = dst.cols;

+    bool is_1d = rows == 1 || cols == 1;
+
+    if(is_1d)
+    {
+        cols = cols + rows - 1;
+    }
+
     if(dst.depth() == CV_32F)
     {
         float* dstData = (float*)dst.data;

-        for(int i = 0; i < rows; i++)
+        if(is_1d)
         {
-            double wr = 0.5 * (1.0f - cos(2.0f * CV_PI * (double)i / (double)(rows - 1)));
-            for(int j = 0; j < cols; j++)
+            for(int i = 0; i < cols; i++)
             {
-                double wc = 0.5 * (1.0f - cos(2.0f * CV_PI * (double)j / (double)(cols - 1)));
-                dstData[i*cols + j] = (float)(wr * wc);
+                double w = 0.5 * (1.0f - cos(2.0f * CV_PI * (double)i / (double)(cols - 1)));
+                dstData[i] = (float)w;
             }
         }
+        else
+        {
+            for(int i = 0; i < rows; i++)
+            {
+                double wr = 0.5 * (1.0f - cos(2.0f * CV_PI * (double)i / (double)(rows - 1)));
+                for(int j = 0; j < cols; j++)
+                {
+                    double wc = 0.5 * (1.0f - cos(2.0f * CV_PI * (double)j / (double)(cols - 1)));
+                    dstData[i*cols + j] = (float)(wr * wc);
+                }
+            }

-        // perform batch sqrt for SSE performance gains
-        cv::sqrt(dst, dst);
+            // perform batch sqrt for SSE performance gains
+            cv::sqrt(dst, dst);
+        }
     }
     else
     {
         double* dstData = (double*)dst.data;

-        for(int i = 0; i < rows; i++)
+        if(is_1d)
         {
-            double wr = 0.5 * (1.0 - cos(2.0 * CV_PI * (double)i / (double)(rows - 1)));
-            for(int j = 0; j < cols; j++)
+            for(int i = 0; i < cols; i++)
             {
-                double wc = 0.5 * (1.0 - cos(2.0 * CV_PI * (double)j / (double)(cols - 1)));
-                dstData[i*cols + j] = wr * wc;
+                double w = 0.5 * (1.0f - cos(2.0f * CV_PI * (double)i / (double)(cols - 1)));
+                dstData[i] = w;
             }
         }
+        else
+        {
+            for(int i = 0; i < rows; i++)
+            {
+                double wr = 0.5 * (1.0 - cos(2.0 * CV_PI * (double)i / (double)(rows - 1)));
+                for(int j = 0; j < cols; j++)
+                {
+                    double wc = 0.5 * (1.0 - cos(2.0 * CV_PI * (double)j / (double)(cols - 1)));
+                    dstData[i*cols + j] = wr * wc;
+                }
+            }

-        // perform batch sqrt for SSE performance gains
-        cv::sqrt(dst, dst);
+            // perform batch sqrt for SSE performance gains
+            cv::sqrt(dst, dst);
+        }
     }
 }
int main(int argc, char* argv[])
{
    Mat firstArray = Mat::zeros(Size(360, 1), CV_64F);
    Mat secondArray = Mat::zeros(Size(360, 1), CV_64F);

    for(int i = 0; i < firstArray.cols; i++)
    {
        if(i < 8)
        {
            firstArray.at<double>(0, i) = 1;
        }

        if(i < 6)
        {
            secondArray.at<double>(0, i) = 1;
        }
    }

    Mat hann;
    createHanningWindow(hann, firstArray.size(), CV_64F);

    Point2d shift = phaseCorrelate(firstArray, secondArray, hann);

    std::cout<< "shift: " << shift.x << ";" << shift.y << std::endl;
    return 0;
}