这段代码的作用是将轮廓分成20个不同的点集,并将每个点集存储在对应的vector<Point2f>中。最后创建一个大小为321x432的黑色图像img作为显示结果的背景。
时间: 2023-07-14 15:14:08 浏览: 46
很好,你理解得很清楚!这段代码使用OpenCV库中的函数cv::approxPolyDP()对输入的轮廓进行多边形拟合,并将其分成20个不同的点集。每个点集都存储在对应的vector<Point2f>中。
最后,通过创建一个大小为321x432的黑色图像img作为显示结果的背景,我们可以将每个点集以不同的颜色绘制到该背景上,以便观察和比较不同的拟合结果。
相关问题
将一组点按 vector<point2f> 行列坐标排序 C++
可以使用 STL 中的 sort 函数和 lambda 表达式来对一组点按照行列坐标排序。假设我们有一个点类 Point2f(OpenCV 库中的点类),其成员变量为 x 和 y 表示横纵坐标,可以使用 lambda 表达式定义一个比较函数,按照行坐标为第一关键字,列坐标为第二关键字进行排序。
代码如下:
```c++
#include <iostream>
#include <algorithm>
#include <vector>
#include <opencv2/core.hpp>
using namespace std;
using namespace cv;
int main() {
vector<Point2f> points = {{2, 3}, {1, 4}, {3, 2}, {1, 2}, {2, 1}};
sort(points.begin(), points.end(), [](Point2f a, Point2f b) {
if (a.x != b.x) {
return a.x < b.x;
} else {
return a.y < b.y;
}
});
for (auto p : points) {
cout << "(" << p.x << ", " << p.y << ")" << endl;
}
return 0;
}
```
以上代码中使用了 lambda 表达式定义了一个比较函数,按照行坐标为第一关键字,列坐标为第二关键字进行排序。最后使用 sort 函数对点集进行排序,输出结果即为按照行列坐标排序后的点集。
注意:以上代码中使用了 OpenCV 库中的 Point2f 类,实际应用中可能需要根据具体情况进行修改。
已知点集ConcurrentBag<Point2f> Allpoints ,拟合一条直线请编写函数,输出ref 两个端点p1,p2 基于opencvsharp4.6编程,生成新的函数
好的,根据您的要求,我编写了以下基于 OpencvSharp4.6 的函数,用于拟合一条直线并输出两个端点:
```csharp
using OpenCvSharp;
public void FitLineAndGetEndpoints(ConcurrentBag<Point2f> Allpoints, out Point2f p1, out Point2f p2)
{
// Convert ConcurrentBag<Point2f> to Mat
var pointsMat = new Mat(Allpoints.Count, 1, MatType.CV_32FC2);
var i = 0;
foreach (var p in Allpoints)
{
pointsMat.At<Vec2f>(i, 0)[0] = p.X;
pointsMat.At<Vec2f>(i, 0)[1] = p.Y;
i++;
}
// Fit a line to the points using PCA
var mean = new Mat();
var eigenvectors = new Mat();
var eigenvalues = new Mat();
Cv2.PCACompute(pointsMat, mean, eigenvectors, eigenvalues, 1);
// Get the direction vector of the line
var direction = eigenvectors.At<Vec2f>(0, 0);
// Get two points on the line
var point1 = new Point2f(direction[0] * eigenvalues.At<float>(0, 0) + mean.At<float>(0, 0),
direction[1] * eigenvalues.At<float>(0, 0) + mean.At<float>(0, 1));
var point2 = new Point2f(mean.At<float>(0, 0) - direction[0] * eigenvalues.At<float>(0, 0),
mean.At<float>(0, 1) - direction[1] * eigenvalues.At<float>(0, 0));
// Set the output points
p1 = point1;
p2 = point2;
}
```
这个函数的输入参数是一个 `ConcurrentBag<Point2f>` 类型的点集 `Allpoints`,输出参数是两个 `Point2f` 类型的端点 `p1` 和 `p2`,用于表示拟合得到的直线。
该函数的实现过程如下:
1. 首先将输入的点集 `Allpoints` 转换为 OpenCV 中的 `Mat` 类型的矩阵 `pointsMat`。
2. 使用 PCA 算法对点集进行拟合,得到一条直线的方向向量和两个点。
3. 根据直线的方向向量和两个点,计算并输出两个端点 `p1` 和 `p2`。
希望这个函数能够满足您的需求。如果您有任何问题,请随时询问。