opencv将contour转成mat
时间: 2024-11-27 09:18:47 浏览: 0
在OpenCV中,当你获取到轮廓(Contour)数据之后,想要将其转换为Mat(矩阵)格式,可以这样做:
首先,轮廓通常是`std::vector<std::vector<cv::Point>>`类型的结构,每个内部的向量代表轮廓上的点。如果你已经有一个 contours 的列表,比如 `std::vector<cv::Vec4i> contours`(表示的是闭合轮廓的外边界点),你可以按照以下步骤将它们转化为一个二维矩阵:
```cpp
cv::Mat contourAsMat;
contourAsMat.create(1, contours.size(), CV_32SC2); // 创建一个 CV_32SC2 类型的单通道 Mat (32位无符号短整型),宽度为1,高度为轮廓的数量
int i = 0;
for (const auto& contour : contours)
{
for (size_t j = 0; j < contour.size(); ++j)
{
contourAsMat.at<cv::Point>(0, i) = contour[j]; // 将轮廓中的点添加到矩阵的每一行
i++;
}
}
```
在这个例子中,`at<cv::Point>`方法用于访问并修改矩阵中指定位置的元素,`contourAsMat.at<cv::Point>(0, i)`相当于坐标 `(0, i)` 的元素,由于我们创建的是单通道矩阵,所以实际上是 `(i, 0)`。
如果你有封闭轮廓的外接矩形(`cv::Rect` 或 `cv::RotatedRect`)而不是点,那么可能需要稍作转换才能形成矩阵:
```cpp
cv::Rect contourBoundingRect = ...; // 或者 cv::RotatedRect 如果是旋转的
contourAsMat.create(1, 4, CV_32SC2); // 4 代表矩形的 x、y、宽和高的4个坐标
contourAsMat.at<cv::Point>(0, 0) = cv::Point(contourBoundingRect.x, contourBoundingRect.y);
contourAsMat.at<cv::Point>(0, 1) = cv::Point(contourBoundingRect.x + contourBoundingRect.width, contourBoundingRect.y);
contourAsMat.at<cv::Point>(0, 2) = cv::Point(contourBoundingRect.x + contourBoundingRect.width, contourBoundingRect.y + contourBoundingRect.height);
contourAsMat.at<cv::Point>(0, 3) = cv::Point(contourBoundingRect.x, contourBoundingRect.y + contourBoundingRect.height);
```
阅读全文