当发现使用SURF场景的参考图像,我想裁剪找到对象在现场,“拉直”回用warpPerspective和反向单应矩阵。
意思是,让我们说我有这个SURF结果:
现在,我想裁剪找到的对象场景:
以及使用该反向单应性矩阵“伸直”仅与warpPerspective裁剪后的图像。 我瞄准的结果是,我会得到含有大致而言,只有物体的图像,有的扭曲与原来的场景剩菜(如裁剪不是100%单独的对象)。
裁剪找到的对象,并找到对应性矩阵和扭转它足够简单。 问题是,我似乎无法理解从warpPerspective的结果。 好像所得到的图像包含仅裁剪图像的一小部分,并且在一个非常大的尺寸。
虽然研究warpPerspective我发现,所产生的图像是非常大的,由于过程的本质,但我似乎无法换我围绕如何做到这一点正确的头。 好像我只是不明白的过程不够好。 我需要warpPerspective原始(未裁切)图像,比裁剪“拉直”对象?
有什么建议?
Answer 1:
试试这个。
因为你有你的对象的轮廓无关(如框轮廓的外角点),你可以用你的逆变换的单应他们并调整单应放置这种转变到图像的左上角区域的结果。
计算其中那些对象点将被扭曲至(使用逆单应性和所述轮廓点作为输入):
cv::Rect computeWarpedContourRegion(const std::vector<cv::Point> & points, const cv::Mat & homography) { std::vector<cv::Point2f> transformed_points(points.size()); for(unsigned int i=0; i<points.size(); ++i) { // warp the points transformed_points[i].x = points[i].x * homography.at<double>(0,0) + points[i].y * homography.at<double>(0,1) + homography.at<double>(0,2) ; transformed_points[i].y = points[i].x * homography.at<double>(1,0) + points[i].y * homography.at<double>(1,1) + homography.at<double>(1,2) ; } // dehomogenization necessary? if(homography.rows == 3) { float homog_comp; for(unsigned int i=0; i<transformed_points.size(); ++i) { homog_comp = points[i].x * homography.at<double>(2,0) + points[i].y * homography.at<double>(2,1) + homography.at<double>(2,2) ; transformed_points[i].x /= homog_comp; transformed_points[i].y /= homog_comp; } } // now find the bounding box for these points: cv::Rect boundingBox = cv::boundingRect(transformed_points); return boundingBox; }
修改反单应(computeWarpedContourRegion和inverseHomography作为输入的结果)
cv::Mat adjustHomography(const cv::Rect & transformedRegion, const cv::Mat & homography) { if(homography.rows == 2) throw("homography adjustement for affine matrix not implemented yet"); // unit matrix cv::Mat correctionHomography = cv::Mat::eye(3,3,CV_64F); // correction translation correctionHomography.at<double>(0,2) = -transformedRegion.x; correctionHomography.at<double>(1,2) = -transformedRegion.y; return correctionHomography * homography; }
你会打电话像
cv::warpPerspective(objectWithBackground, output, adjustedInverseHomography, sizeOfComputeWarpedContourRegionResult);
希望这有助于=)
文章来源: OpenCV 2.4.3 - warpPerspective with reversed homography on a cropped image