Разделить сложный мат с реальным матом в OpenCV

Как я могу разделить сложный мат с реальным матом в OpenCV? Я хочу рассчитать спектр перекрестной мощности для фазовой корреляции, но я получаю ошибку времени выполнения при использовании деления.

Обновить
Я нашел способ рассчитать спектр кросс-мощности, но я не получил подходящий результат, чтобы найти перевод изображения. Ниже приведен код.
Я разделил результат обратного DFT, потому что у него есть два канала. Затем я смог разделить, но результат не подходит для перевода только по горизонтальной оси. Должно быть только одно максимальное значение, но есть много максимальных значений.

Образ

void computeFFTMag(Mat&,Mat&,Mat&);
string getImgType(int );

int main( int argc, char** argv )
{
Mat ref,sens,refMag,sensMag,refFFT,sensFFT;
ref = imread("lena1.jpg",CV_LOAD_IMAGE_GRAYSCALE);
sens = imread("lena3.jpg",CV_LOAD_IMAGE_GRAYSCALE);namedWindow( "Sensed Image", CV_WINDOW_AUTOSIZE );
imshow( "Sensed Image", sens );

computeFFTMag(ref,refMag,refFFT);
computeFFTMag(sens,sensMag,sensFFT);Mat R1,R2,R,r,rf[2],rff;
mulSpectrums(refFFT,sensFFT,R1,0,true);
multiply(refMag,sensMag,R2);
dft(R1,r,DFT_REAL_OUTPUT);
split(r,rf);
divide(rf[0],R2,r);
normalize(r, r, 0, 1, CV_MINMAX);
namedWindow( "Reference Image", CV_WINDOW_AUTOSIZE );
imshow("Reference Image"       , r   );
}void computeFFTMag(Mat& input,Mat& fftMag,Mat& complexFFT){
Mat inputPadded;
/*int r=getOptimalDFTSize(input.rows);
int c=getOptimalDFTSize(input.cols);
copyMakeBorder(input,inputPadded,0,r-input.rows,0,c-input.cols,BORDER_CONSTANT, Scalar::all(0));*/
Mat fftPlanes[] = {Mat_<float>(input), Mat::zeros(input.size(), CV_32F)};
//Mat complexFFT;
merge(fftPlanes, 2, complexFFT);

dft(complexFFT,complexFFT);
split(complexFFT,fftPlanes);
magnitude(fftPlanes[0],fftPlanes[1],fftPlanes[0]);

fftMag=fftPlanes[0];

//fftMag = fftMag(Rect(0, 0, fftMag.cols & -2, fftMag.rows & -2));
int cx = fftMag.cols/2;
int cy = fftMag.rows/2;
Mat q0(fftMag, Rect(0, 0, cx, cy));   // Top-Left - Create a ROI per quadrant
Mat q1(fftMag, Rect(cx, 0, cx, cy));  // Top-Right
Mat q2(fftMag, Rect(0, cy, cx, cy));  // Bottom-Left
Mat q3(fftMag, Rect(cx, cy, cx, cy)); // Bottom-Right

Mat tmp;                           // swap quadrants (Top-Left with Bottom-Right)
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);

q1.copyTo(tmp);                    // swap quadrant (Top-Right with Bottom-Left)
q2.copyTo(q1);
tmp.copyTo(q2);
}

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]