В приведенном ниже примере используется findHomography
для преобразования двух наборов точек. Я хочу ограничить количество степеней свободы, используемых при преобразовании, поэтому хочу заменить findHomography
на estimateRigidTransform
.
Ниже я использую estimateRigidTransform
, чтобы получить преобразование между точками объекта и сцены. objPoints
и scePoints
представлены vector <Point2f>
.
Mat H = estimateRigidTransform(objPoints, scePoints, false);
Следуя методу, использованному в уроке выше, я хочу преобразовать значения углов, используя преобразование H
. В учебнике используется perspectiveTransform
с матрицей 3x3, возвращаемой findHomography
. С жестким преобразованием он возвращает только матрицу 2x3, поэтому этот метод нельзя использовать.
Как бы я преобразовал значения углов, представленных как vector <Point2f>
с этой матрицей 2x3. Я просто хочу выполнить те же функции, что и в учебнике, но с меньшими степенями свободы для трансформации. Я просмотрел и другие методы, такие как warpAffine
и getPerspectiveTransform
, но пока не нашел решения.
РЕДАКТИРОВАТЬ:
Я попробовал предложение Дэвида Нилосека. Ниже я добавляю дополнительную строку в матрицу.
Mat row = (Mat_<double>(1,3) << 0, 0, 1);
H.push_back(row);
Однако это дает эту ошибку при использовании перспективыTransform.
OpenCV Error: Assertion failed (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0)) in create, file /Users/cgray/Downloads/opencv-2.4.6/modules/core/src/matrix.cpp, line 1486
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /Users/cgray/Downloads/opencv-2.4.6/modules/core/src/matrix.cpp:1486: error: (-215) mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0) in function create
ChronoTrigger предложил использовать warpAffine
. Я вызываю метод warpAffine
ниже, размер 1 x 5 соответствует размеру objCorners
и sceCorners
.
warpAffine(objCorners, sceCorners, H, Size(1,4));
Это дает ошибку ниже, которая предлагает неправильный тип. objCorners
и sceCorners
— это vector <Point2f>
, представляющие 4 угла. Я думал, что warpAffine
примет Mat
изображений, которые могут объяснить ошибку.
OpenCV Error: Assertion failed ((M0.type() == CV_32F || M0.type() == CV_64F) && M0.rows == 2 && M0.cols == 3) in warpAffine, file /Users/cgray/Downloads/opencv-2.4.6/modules/imgproc/src/imgwarp.cpp, line 3280