好的,这是我的情景。我建立了一个纸质检测应用程序,可以在图像中找到一张纸。考虑到白平衡和聚焦变化,它在100%的时间内都不起作用,所以如果我们在第1帧中找到一张纸,我们想在第2帧中显示它周围的边框(实际上可能有很多框架间隙),即使我们没有在第2帧中找到它。为了做到这一点,我们保留旧图像和第1帧的旧4点轮廓。
然后,在我们没有找到凸轮廓的帧N中,我们想要使用我们使用estimageRigidTransform计算的仿射变换来变换旧轮廓。
我100%肯定我的数学略有偏差,但我不知道在哪里:
// new image = 3200 x 6400
// old image = 3200 x 6400
// old contour = contour found in old image, same scale
vector<cv::Point> transformContourWithNewImage(Mat & newImage, Mat & oldImage, vector<cv::Point> oldContour) {
CGFloat ratio = newImage.size().height / 500.0;
cv::Size outputSize = cv::Size(newImage.size().width / ratio, 500);
Mat image_copy;
resize(newImage, image_copy, outputSize); //shrink images down so that computations are cheaper
Mat oldImage_copy = cv::Mat();
resize(oldImage, oldImage_copy, outputSize);
cv::Mat transform = estimateRigidTransform(image_copy, oldImage_copy, false);
vector<cv::Point> transformedPoints;
cv::transform(oldContour, transformedPoints, transform);
return transformedPoints;
}
我认为我需要缩放变换,因为它是在比轮廓矢量表示的更小的图像上完成的。我也遇到了一个崩溃,说我的变换Mat有错误的行数/列数