C++ opencv findContours限制线宽
时间: 2023-07-03 11:20:18 浏览: 45
在使用OpenCV的findContours函数时,您可以通过修改轮廓的线宽来实现限制线宽的效果。具体而言,可以使用cv::drawContours函数绘制轮廓,并在其中指定线宽参数。例如,以下代码将绘制线宽为2的轮廓:
```c++
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(image, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
cv::Mat drawing = cv::Mat::zeros(image.size(), CV_8UC3);
for (size_t i = 0; i < contours.size(); i++) {
cv::Scalar color = cv::Scalar(255, 255, 255);
cv::drawContours(drawing, contours, i, color, 2, cv::LINE_8, hierarchy, 0);
}
```
在上述代码中,drawContours函数的第5个参数指定了线宽为2。您可以将其修改为其他值以实现不同的线宽效果。
相关问题
c++opencv findContours轮廓后分别拟合圆
好的,您可以使用以下步骤来进行轮廓拟合圆:
1. 使用 `findContours` 函数找到图像中的轮廓。
2. 对于每一个轮廓,使用 `approxPolyDP` 函数将其拟合成为一个多边形,以便于后续的圆拟合。
3. 使用 `fitEllipse` 函数对多边形进行圆拟合,得到拟合后的圆心和半径。
4. 可以选择性地使用 `drawContours` 函数将拟合后的圆绘制在原图像上。
下面是一个简单的示例代码,其中 `srcImg` 是输入的图像,`dstImg` 是输出的图像,`contours` 是找到的轮廓:
```cpp
Mat srcImg, dstImg;
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
srcImg = imread("your_image_path");
cvtColor(srcImg, dstImg, COLOR_BGR2GRAY);
findContours(dstImg, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);
for (size_t i = 0; i < contours.size(); i++)
{
vector<Point> poly;
approxPolyDP(contours[i], poly, 3, true);
if (poly.size() >= 5)
{
RotatedRect rect = fitEllipse(poly);
ellipse(srcImg, rect, Scalar(0, 255, 0), 2);
}
}
```
这段代码将找到的每一个轮廓进行多边形拟合,并对拟合后的多边形进行圆拟合,并将圆绘制在原图像上。当然,您可以根据自己的需求进行修改。
c++ 版本的opencv findContours 怎么使用
C++ 版本的 OpenCV 中,`findContours` 函数的使用方法与 Python 版本基本相同。下面是一个示例代码,用于演示如何使用 `findContours` 函数查找并绘制图像中的轮廓:
```
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 读取图像
Mat img = imread("image.jpg");
// 转换为灰度图像
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
// 二值化处理
Mat thresh;
threshold(gray, thresh, 127, 255, THRESH_BINARY);
// 查找轮廓
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(thresh, contours, hierarchy, RET_TREE, CHAIN_APPROX_SIMPLE);
// 绘制轮廓
drawContours(img, contours, -1, Scalar(0, 255, 0), 2);
// 显示图像
imshow("Contours", img);
waitKey(0);
destroyAllWindows();
return 0;
}
```
在上面的代码中,我们首先使用 `imread` 函数读取一张图像,然后将其转换为灰度图像,并进行二值化处理。接着,使用 `findContours` 函数查找轮廓,并将其存储在 `contours` 变量中。最后,使用 `drawContours` 函数将轮廓绘制到原始图像上,并显示结果。
需要注意的是,C++ 版本中的 `findContours` 函数的参数与 Python 版本略有不同。具体而言,C++ 版本的 `findContours` 函数的第三个参数为 `hierarchy`,而 Python 版本为 `contours, hierarchy`,且返回值也不同。此外,C++ 版本的 `drawContours` 函数的第四个参数为 `Scalar(0, 255, 0)`,而 Python 版本为 `(0, 255, 0)`。