Я вижу вероятность того, что тип матрицы изменился с float
на double
после его присвоения (hom=getPerspectiveTransform(sour,dest);
). Если это так, то CV_Assert(hom.type() == cv::DataType<float>::type);
собирается сгенерировать исключение.
Чтобы решить эту проблему, необходимо обратиться к элементам матрицы по правильному типу, вероятно, double
. Поэтому, когда вы печатаете матрицу, замените hom.at<float>
на hom.at<double>
и посмотрите, поможет ли это.
Кстати, я не вижу смысла сначала объявлять матрицу как cv::Mat hom(3, 3, CV_32F);
. Вы можете, вероятно, напрямую сделать cv::Mat hom = getPerspectiveTransform(sour, dest);
.
Другим решением этой проблемы является использование статически типизированной матрицы, то есть
cv::Matx<float, 3, 3> hom = getPerspectiveTransform(sour, dest);
. OpenCV автоматически преобразует значение, возвращаемое getPerspectiveTransform
, в правильный тип в присваивании. Затем, когда вы печатаете элементы, вы можете заменить hom.at<float>(i1, i2)
на hom(i1, i2)
, так как тип элемента теперь статически известен.
Обновление:
Тот факт, что оператор <<
, кажется, печатает элементы матрицы hom
примерно с 16 десятичными цифрами, говорит о том, что точность равна double
. Для одинарной точности (float
) это было бы около 7 десятичных цифр.