Ошибка iOS и OpenCV: сбой подтверждения в PhaseCorrelateRes

0

Я пытаюсь обнаружить сдвиг между 2 изображениями с помощью OpenCV в iOS. Функция, которую я использовал, - это PhaseCorrelate, которая должна возвращать Point2d с учетом двух изображений cv::Mat. Я следовал примеру кода здесь, преобразовывая UIImage в Mat, а затем преобразовывая Mat в CV_32F. Но я продолжал получать эту ошибку:

OpenCV Error: Assertion failed (src1.type() == CV_32FC1 || src1.type() == CV_64FC1) in            phaseCorrelateRes, file /Users/alexandershishkov/dev/opencvIOS/opencv-2.4.7/modules/imgproc/src/phasecorr.cpp, line 498
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /Users/alexandershishkov/dev/opencvIOS/opencv-2.4.7/modules/imgproc/src/phasecorr.cpp:498: error: (-215) src1.type() == CV_32FC1 || src1.type() == CV_64FC1 in function phaseCorrelateRes

Я не понимаю, почему я получил эту ошибку, потому что я преобразовал тип Mat в CV_32F. FYI: причина, по которой я не конвертировался в CV_64F, - это потому, что она стоит огромной памяти, и приложение в iOS немедленно закрывается из-за большой памяти.

Вот фрагмент моего кода, где произошла ошибка (при вызове phaseCorrelate):

#ifdef __cplusplus
-(void)alignImages:(NSMutableArray *)camImages
{
int i;
Mat matImages, refMatImage, hann;
Point2d pcPoint;

for (i = 0; i < [camImages count]; i++) {
    if(i == 0){
        UIImageToMat([camImages objectAtIndex:i], refMatImage);
        refMatImage.convertTo(refMatImage, CV_32F);
        createHanningWindow(hann, refMatImage.size(), CV_32F);
    }
    else{
        UIImageToMat([camImages objectAtIndex:i], matImages);
        matImages.convertTo(matImages, CV_32F);

        pcPoint = phaseCorrelate(refMatImage, matImages, hann);
        NSLog(@"phase correlation points: (%f,%f)",pcPoint.x, pcPoint.y);
    }
}
NSLog(@"Done Converting!");
}
#endif
Теги:
opencv
camera
image

1 ответ

0
Лучший ответ

Nevermind, это было вызвано тем фактом, что UIImage имеет 3 канала в первую очередь. При преобразовании в тип Mat и CV_32F полученный Mat был фактически типа CV_32FC3 (3 канала); Поэтому произошла ошибка, так как тип параметра не совпал.

Мое решение состоит в том, чтобы разбить исходный Mat на массив каналов, а затем передать ONE только функции phaseCorrelate:

vector<Mat> refChannels;
split(refMatImage, refChannels);
phaseCorrelate(refChannels[0],...);
  • 0
    Чудесно, я только что решил эту проблему и нашел твой ответ. Другой способ решить эту проблему - преобразовать напрямую в одноканальный коврик с помощью mat1.convertTo(mat1, CV_32FC1);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню