opencv c++ 缺陷检测
时间: 2023-12-23 22:28:28 浏览: 102
以下是使用OpenCV C++进行缺陷检测的步骤:
1. 读入图像并进行预处理:
```cpp
Mat src = imread("D:/opencv练习图片/瓶口缺陷检测.png");
Mat gray;
cvtColor(src, gray, COLOR_RGB2GRAY);
medianBlur(gray, gray, 3);
```
2. 进行霍夫圆检测:
```cpp
vector<Vec3f> circles;
HoughCircles(gray, circles, HOUGH_GRADIENT, 1, 100, 200, 30, 150, 500);
```
3. 在原图上绘制检测到的圆:
```cpp
Mat dst;
src.copyTo(dst);
for (size_t i = 0; i < circles.size(); i++)
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
circle(dst, center, radius, Scalar(0, 0, 255), 2);
}
imshow("缺陷检测结果", dst);
```
相关问题
opencv凸包缺陷检测c++代码
以下是使用OpenCV库进行凸包和缺陷检测的C++代码示例:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
using namespace std;
using namespace cv;
int main()
{
// 加载图像
Mat img = imread("hand.jpg");
if (img.empty())
{
cout << "图像加载失败!" << endl;
return -1;
}
// 将图像转换为灰度图
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
// 进行二值化处理
Mat binary;
threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
// 查找轮廓
vector<vector<Point>> contours;
findContours(binary, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 查找凸包和凸包缺陷
vector<vector<Point>> hull(contours.size());
vector<vector<int>> hull_idx(contours.size());
vector<vector<Vec4i>> defects(contours.size());
for (int i = 0; i < contours.size(); i++)
{
convexHull(contours[i], hull[i], false);
convexHull(contours[i], hull_idx[i], false);
convexityDefects(contours[i], hull_idx[i], defects[i]);
}
// 绘制凸包和凸包缺陷
Mat drawing = Mat::zeros(binary.size(), CV_8UC3);
for (int i = 0; i < contours.size(); i++)
{
drawContours(drawing, contours, i, Scalar(0, 255, 0), 1);
drawContours(drawing, hull, i, Scalar(0, 0, 255), 1);
for (int j = 0; j < defects[i].size(); j++)
{
Vec4i& v = defects[i][j];
float depth = v[3] / 256.0;
if (depth > 10) // 过滤掉一些噪点
{
int start_idx = v[0];
int end_idx = v[1];
int far_idx = v[2];
Point start = contours[i][start_idx];
Point end = contours[i][end_idx];
Point far = contours[i][far_idx];
line(drawing, start, far, Scalar(0, 255, 0), 1);
line(drawing, end, far, Scalar(0, 255, 0), 1);
circle(drawing, far, 3, Scalar(0, 0, 255), -1);
}
}
}
// 显示图像
imshow("凸包和凸包缺陷检测", drawing);
waitKey(0);
return 0;
}
```
说明:
1. 该代码加载名为"hand.jpg"的图像,将其转换为灰度图,并对其进行二值化处理。
2. 通过`findContours`函数查找图像中的轮廓。
3. 通过`convexHull`函数分别对每个轮廓进行凸包计算,并查找凸包的索引。
4. 通过`convexityDefects`函数查找每个轮廓的凸包缺陷。
5. 最后,通过`drawContours`、`line`和`circle`函数将凸包和凸包缺陷绘制在图像上,并显示出来。
需要注意的是,凸包缺陷的计算比较复杂,需要结合凸包和轮廓进行计算,因此代码中使用了三个vector来保存凸包、凸包索引和凸包缺陷。
opencv表面缺陷检测python
很抱歉,根据提供的引用内容,没有找到关于Python实现OpenCV表面缺陷检测的相关信息。但是,引用中提到了一个C++编写的工件缺陷检测项目,可以作为参考。下面是该项目的大致步骤:
1. 读取视频帧,将每一帧转换为灰度图像。
2. 对灰度图像进行二值化处理,得到二值图像。
3. 对二值图像进行形态学操作,如腐蚀、膨胀等,以去除噪声和平滑图像。
4. 对处理后的图像进行轮廓检测,找到所有的轮廓。
5. 对每个轮廓进行特征提取,如面积、周长、凸包等。
6. 根据特征值判断缺陷类型,如裂纹、气泡、异物等。
7. 将检测结果标记在原图像上,并输出结果。
如果您想使用Python实现OpenCV表面缺陷检测,可以参考上述步骤,使用Python的OpenCV库进行相应的操作。同时,您需要了解Python的基本语法和OpenCV库的使用方法。
阅读全文