企业网站建设方案教程,建筑装饰网站模板,网站免费空间哪里申请,页面正在跳转 3秒后自动个人理解为将一幅不规则的图形#xff0c;通过最轮廓发现#xff0c;最大轮廓匹配来确定图像的位置#xff0c;再通过pt将不规则的图像放在规定的矩形里面#xff0c;在通过透视变换将不规则的图形放进规则的图像中。
1. findHomography 函数
• Mat h findHomography(s…个人理解为将一幅不规则的图形通过最轮廓发现最大轮廓匹配来确定图像的位置再通过pt将不规则的图像放在规定的矩形里面在通过透视变换将不规则的图形放进规则的图像中。
1. findHomography 函数
• Mat h findHomography(srcPts, dstPts, RANSAC);
• 功能该函数用于计算从源点集 srcPts 到目标点集 dstPts 的单应性矩阵 h。单应性矩阵描述了两个平面之间的投影变换关系。
• 参数
• srcPts源图像中的点集是一个 std::vectorcv::Point2f 类型的向量包含至少4个点。这些点在源图像平面上定义了一个区域。
• dstPts目标图像中的对应点集同样是 std::vectorcv::Point2f 类型与 srcPts 中的点一一对应。它定义了源图像区域要映射到的目标图像区域。
• RANSAC这是一种稳健的估计方法称为随机抽样一致算法Random Sample Consensus。使用 RANSAC 时函数会通过多次随机抽样来估计单应性矩阵并排除可能的误匹配点从而得到更准确可靠的单应性矩阵。
• 返回值返回一个 cv::Mat 类型的单应性矩阵 h它是一个 3x3 的矩阵用于后续的透视变换。如果无法找到合适的单应性矩阵例如点集数量不足或匹配质量太差返回的矩阵将是一个空矩阵。
2. warpPerspective 函数
• warpPerspective(image, dst, h, Size(600, 800));
• 功能根据给定的单应性矩阵 h 对输入图像 image 进行透视变换并将结果存储在 dst 中。透视变换可以将图像从一个平面投影到另一个平面常用于纠正图像的透视畸变、图像拼接等任务。
• 参数
• image输入的源图像是一个 cv::Mat 类型的对象。
• dst输出的目标图像也是 cv::Mat 类型。在调用函数前不需要对其进行初始化函数会根据变换结果自动分配内存。
• h前面通过 findHomography 函数计算得到的单应性矩阵它决定了图像如何进行透视变换。
• Size(600, 800)指定输出图像 dst 的大小这里宽为600像素高为800像素。变换后的图像会被调整到这个尺寸。
这两行代码在图像变换处理中是非常关键的步骤先计算单应性矩阵再基于此矩阵对图像进行透视变换从而实现将源图像的特定区域映射到目标图像的指定区域。 #include opencv2/opencv.hpp #include iostream
using namespace cv; using namespace std;
int main(int argc, char** argv) { // Mat image imread(D:/images/butterfly.jpg); Mat image imread(C:/newword/image/31.jpg); Mat gray, binary; cvtColor(image, gray, COLOR_BGR2GRAY); threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU); vectorvectorPoint contours; vectorVec4i hierachy; findContours(binary, contours, hierachy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); int index -1; double max -1; for (int i 0; i contours.size(); i) { double area contourArea(contours[i]); if (area max) { max area; index i; } } drawContours(image, contours, index, Scalar(0, 255, 0), 2, 8); Mat approxCurves; vectorPoint2f srcPts; approxPolyDP(contours[index], approxCurves, 100, true); for (int i 0; i approxCurves.rows; i) { Vec2i pt approxCurves.atVec2i(i, 0);//0代表着索引值访问坐标 std::cout pt std::endl; srcPts.push_back(Point2f(pt[0], pt[1])); circle(image, Point(pt[0], pt[1]), 12, Scalar(0, 0, 255), 2, 8, 0); } vectorPoint2f dstPts; dstPts.push_back(Point2f(0, 0)); dstPts.push_back(Point2f(0, 800)); dstPts.push_back(Point2f(600, 800)); dstPts.push_back(Point2f(600, 0)); imshow(轮廓, image); imwrite(C:/newword/result_c1c.png, image); Mat h findHomography(srcPts, dstPts, RANSAC); Mat dst; warpPerspective(image, dst, h, Size(600, 800)); imwrite(C:/newword/dst.p1ng, dst); waitKey(0); return 0; }