c++opencv轮廓识别
时间: 2023-11-14 18:07:53 浏览: 47
C++ OpenCV轮廓识别是一种图像处理技术,它可以通过检测图像中的轮廓来识别出物体的形状和大小。在OpenCV中,轮廓是一组连续的点,表示相同颜色或强度的区域的边界。轮廓识别可以通过以下步骤实现:
1. 读取图像并将其转换为灰度图像。
2. 对图像进行二值化处理,以便更好地检测轮廓。
3. 使用findContours函数查找图像中的轮廓。
4. 对轮廓进行过滤和排序,以便更好地识别物体。
5. 绘制轮廓并在图像中标记物体。
在C++ OpenCV中,轮廓通常表示为vector<vector<Point>>类型的变量,其中每个vector<Point>表示一个轮廓。可以使用vector<Vec4i>类型的变量来存储轮廓的层次结构。此外,可以使用vector<Rect>或vector<RotatedRect>类型的变量来存储物体的边界框或旋转矩形。
相关问题
c++ opencv 图片识别
要使用 C++ 和 OpenCV 进行图片识别,你需要安装 OpenCV 库并了解一些基本概念。以下是一个简单的示例程序,可以识别并在控制台上输出图片中的红色圆形:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 读入图片
Mat img = imread("test.jpg");
// 转换为 HSV 格式
Mat hsv;
cvtColor(img, hsv, COLOR_BGR2HSV);
// 提取红色区域
Mat mask1, mask2;
inRange(hsv, Scalar(0, 70, 50), Scalar(10, 255, 255), mask1);
inRange(hsv, Scalar(170, 70, 50), Scalar(180, 255, 255), mask2);
Mat mask = mask1 | mask2;
// 查找轮廓
vector<vector<Point>> contours;
findContours(mask, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 遍历轮廓
for (size_t i = 0; i < contours.size(); i++) {
// 计算轮廓面积和周长
double area = contourArea(contours[i]);
double perimeter = arcLength(contours[i], true);
// 过滤掉非圆形轮廓
if (area > 1000 && perimeter > 100) {
double circularity = 4 * M_PI * area / (perimeter * perimeter);
if (circularity > 0.8) {
// 输出圆形信息
cout << "Red circle detected!" << endl;
}
}
}
return 0;
}
```
这个程序首先读入一张图片,然后将其转换为 HSV 格式。接着,使用 inRange 函数提取出红色区域,并使用 findContours 函数查找轮廓。最后,遍历所有轮廓,计算面积、周长和圆形度,判断是否为红色圆形。
c++ opencv图像识别代码
以下是一个简单的基于OpenCV的C++图像识别示例代码:
```cpp
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
// 读取图像
Mat image = imread("test.jpg", IMREAD_COLOR);
if (image.empty()) {
cout << "Could not open or find the image" << endl;
return -1;
}
// 将图像转为灰度图
Mat grayImage;
cvtColor(image, grayImage, COLOR_BGR2GRAY);
// 对图像进行二值化处理
Mat binaryImage;
threshold(grayImage, binaryImage, 100, 255, THRESH_BINARY);
// 进行轮廓提取
vector<vector<Point>> contours;
findContours(binaryImage, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
// 在图像中画出轮廓
Mat contourImage = Mat::zeros(binaryImage.size(), CV_8UC3);
for (int i = 0; i < contours.size(); i++) {
drawContours(contourImage, contours, i, Scalar(0, 0, 255), 2);
}
// 显示图像
namedWindow("Original Image", WINDOW_NORMAL);
namedWindow("Contours", WINDOW_NORMAL);
imshow("Original Image", image);
imshow("Contours", contourImage);
// 等待按键
waitKey(0);
return 0;
}
```
该代码实现了对一张图像进行轮廓提取,并在图像中画出轮廓的功能。其中,使用了OpenCV中的一些常用函数,例如imread(),cvtColor(),threshold(),findContours()和drawContours()等。