OpenCV,使用estimateRigidTransform来变换轮廓

时间:2016-01-06 01:18:49

标签: opencv

好的,这是我的情景。我建立了一个纸质检测应用程序,可以在图像中找到一张纸。考虑到白平衡和聚焦变化,它在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有错误的行数/列数

0 个答案:

没有答案