opencv c++中findContours的语法
时间: 2023-08-04 10:32:58 浏览: 38
findContours函数的语法如下:
```
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point());
```
函数参数说明:
- `image`:输入图像,必须为8位单通道二值图像,非零像素表示轮廓,0像素表示背景。
- `contours`:输出参数,用于存储检测到的轮廓,每个轮廓都表示为一组点的向量。
- `hierarchy`:输出参数,用于存储轮廓之间的关系,可选参数。
- `mode`:轮廓检索模式,可选值包括`RETR_EXTERNAL`(只检测最外层轮廓)、`RETR_LIST`(检测所有轮廓,但不建立轮廓的层次结构)、`RETR_CCOMP`(检测所有轮廓,并将轮廓分为两级层次结构,顶层为物体的外部边界,次层为物体内部的空洞边界)、`RETR_TREE`(检测所有轮廓,并重建轮廓的完整层次结构)。
- `method`:轮廓逼近方法,可选值包括`CHAIN_APPROX_NONE`(保存所有的轮廓点)、`CHAIN_APPROX_SIMPLE`(压缩水平、垂直和对角线方向上的冗余点,仅保留轮廓的端点)、`CHAIN_APPROX_TC89_L1`、`CHAIN_APPROX_TC89_KCOS`(使用Teh-Chinl链逼近算法中的一个)。
- `offset`:可选参数,偏移量。
函数返回值为void类型,表示没有返回值。
相关问题
opencv c++中findcontours语法
在OpenCV C++中,`findContours`函数的语法如下:
```c++
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point());
```
其中,参数含义如下:
- `image`:输入的二值图像,通常为经过边缘检测后得到的图像。
- `contours`:输出的轮廓,为一个`vector<vector<Point> >`类型的数组,其中每个元素表示一个轮廓,包含一系列点的坐标。
- `hierarchy`:输出的轮廓的层级关系,为一个`vector<Vec4i>`类型的数组,其中每个元素包含四个整数,分别表示当前轮廓的父轮廓、子轮廓、内嵌轮廓和外层轮廓的索引。
- `mode`:轮廓检索模式,可以取以下值:
- `RETR_EXTERNAL`:只检索最外层的轮廓。
- `RETR_LIST`:检索所有轮廓,但不建立轮廓间的层级关系。
- `RETR_CCOMP`:检索所有轮廓,并将轮廓分为两层:顶层为各部分的外部边界,次层为空洞的边界。
- `RETR_TREE`:检索所有轮廓,并重构嵌套轮廓的完整层级关系。
- `method`:轮廓逼近方法,可以取以下值:
- `CHAIN_APPROX_NONE`:保存物体边界上所有连续的轮廓点到contours向量内。
- `CHAIN_APPROX_SIMPLE`:压缩水平、垂直和对角线方向上的像素,仅保留终点坐标。
- `CHAIN_APPROX_TC89_L1`:使用Teh-Chin链逼近算法中的L1距离。
- `CHAIN_APPROX_TC89_KCOS`:使用Teh-Chin链逼近算法中的Kcos距离。
- `offset`:可选的偏移量,用于指定轮廓点坐标的偏移值。
例如,在检测最外层轮廓并使用简单的轮廓逼近方法时,可以这样调用`findContours`函数:
```c++
Mat img = imread("test.jpg", IMREAD_GRAYSCALE);
Mat img_canny;
Canny(img, img_canny, 100, 200);
vector<vector<Point>> contours;
findContours(img_canny, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
```
这将读入名为`test.jpg`的灰度图像,对其进行Canny边缘检测,并在其中寻找最外层轮廓,使用简单的轮廓逼近方法。最终,找到的轮廓将存储在`contours`向量内。
通过c++语法帮我利用opencv在qt界面上通过调用摄像头,写形状检测矩形的代码(绘制矩形框)
当然可以!以下是一个基于C++和OpenCV的示例代码,用于在Qt界面上调用摄像头并进行形状检测(矩形),并在画面中绘制矩形框:
```c++
#include <QCoreApplication>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// 打开摄像头
VideoCapture cap(0);
if (!cap.isOpened())
{
qDebug() << "无法打开摄像头!";
return -1;
}
// 创建窗口
namedWindow("Shape Detection", WINDOW_NORMAL);
while (true)
{
Mat frame;
cap >> frame; // 读取摄像头图像
// 将图像转换为灰度图像
Mat gray_frame;
cvtColor(frame, gray_frame, COLOR_BGR2GRAY);
// 对灰度图像进行阈值处理,提取形状
Mat binary_frame;
threshold(gray_frame, binary_frame, 127, 255, THRESH_BINARY);
// 寻找轮廓
std::vector<std::vector<Point>> contours;
std::vector<Vec4i> hierarchy;
findContours(binary_frame.clone(), contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 对每个轮廓进行形状检测并绘制矩形框
for (size_t i = 0; i < contours.size(); i++)
{
// 计算轮廓的周长
double perimeter = arcLength(contours[i], true);
// 进行形状近似,获取多边形的顶点
std::vector<Point> approx;
approxPolyDP(contours[i], approx, 0.04 * perimeter, true);
// 如果近似的顶点数为4,则为矩形
if (approx.size() == 4)
{
Rect bounding_rect = boundingRect(approx);
rectangle(frame, bounding_rect, Scalar(0, 255, 0), 2);
}
}
// 显示图像
imshow("Shape Detection", frame);
// 按Esc键退出循环
if (waitKey(1) == 27)
break;
}
// 释放摄像头和销毁窗口
cap.release();
destroyAllWindows();
return a.exec();
}
```
请确保已经正确配置了Qt和OpenCV,并将代码中的`#include`和`using namespace`语句适配到您的项目中。然后,您可以将其编译并运行,将会显示一个名为"Shape Detection"的窗口,其中会实时显示摄像头捕获到的图像,并在检测到的矩形区域绘制矩形框。
请注意,这只是一个简单的示例,可能无法适应所有场景。您可能需要根据您的具体需求进行调整和优化。