cv.drawContours为什么运行出来图像太大了
时间: 2024-10-12 10:06:24 浏览: 41
`cv.drawContours` 函数用于在 OpenCV 中绘制轮廓,如果绘制出的图像比预期的大,可能是以下几个原因导致的:
1. **大小设置错误**:检查你在调用 `drawContours` 之前是否正确设置了绘图窗口或输出图像的大小。确保你在创建 `Mat` 或者显示图片时设置了合适的宽度和高度。
```python
img = cv2.resize(input_image, (desired_width, desired_height))
cv2.imshow('contours', img)
```
2. **轮廓数据处理**:如果轮廓列表 (`contours`) 包含多个轮廓,它们各自的边界可能会超过原图像范围。确保你在绘制前对每个轮廓应用适当的坐标变换,例如将它们缩放到适应的图像区域内。
3. **绘图选项**:`cv2.drawContours` 的第三个参数 `thickness` 和第四个参数 `lineType` 可能影响线条粗细,这间接影响了图像尺寸。适当调整这两个参数可以避免线条太粗导致图形过大。
4. **填充颜色**:如果你设置了轮廓的填充色 (`fillColor`),特别是当填充区域较大时,会增加图像的总体大小。
5. **视口放大**:确认没有无意中放大了显示窗口,有时鼠标滚轮的操作可能导致图像看起来更大。
解决这些问题后,你应该能看到正常的图像大小。如果你还是遇到问题,可以提供更多的上下文代码以便更精确地定位问题。
相关问题
cv::findContours 查找 中心为空的圆圈的两个轮廓
中心为空的圆圈通常指的是环形,它有两个轮廓:内轮廓和外轮廓。如果您想查找中心为空的圆圈的两个轮廓,可以使用cv::findContours函数,并指定RETR_LIST模式。以下是一个示例代码:
```c++
cv::Mat img; // 二值化图像
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(img, contours, hierarchy, cv::RETR_LIST, cv::CHAIN_APPROX_SIMPLE);
// 遍历轮廓
for (int i = 0; i < contours.size(); i++) {
double area = cv::contourArea(contours[i]);
// 如果轮廓面积太小,则跳过
if (area < 100) continue;
// 判断轮廓是否为环形
std::vector<cv::Point> hull;
cv::convexHull(contours[i], hull);
double hull_area = cv::contourArea(hull);
if (std::abs(hull_area - area) > 1e-3) continue;
// 计算内外轮廓
std::vector<std::vector<cv::Point>> inner_contours, outer_contours;
cv::Mat mask = cv::Mat::zeros(img.size(), CV_8UC1);
cv::drawContours(mask, contours, i, cv::Scalar(255), cv::FILLED);
cv::findContours(mask, inner_contours, cv::RETR_LIST, cv::CHAIN_APPROX_SIMPLE);
cv::drawContours(mask, inner_contours, -1, cv::Scalar(0), cv::FILLED);
cv::findContours(mask, outer_contours, cv::RETR_LIST, cv::CHAIN_APPROX_SIMPLE);
// 绘制内外轮廓
cv::drawContours(img, inner_contours, -1, cv::Scalar(255), 2);
cv::drawContours(img, outer_contours, -1, cv::Scalar(255), 2);
}
```
上述代码首先遍历所有轮廓,计算其面积并判断是否太小。然后使用cv::convexHull函数计算轮廓的凸包,并计算凸包面积。如果轮廓面积与凸包面积差异较大,则认为它不是环形。然后使用cv::drawContours函数生成轮廓掩码,并使用cv::findContours函数查找内外轮廓。最后使用cv::drawContours函数绘制内外轮廓。
阅读全文