python - 使用OpenCV实时检测不同形状的交通标志
问题描述
我正在尝试创建一个可以从摄像头检测交通标志的应用程序。但是,我在检测标志时遇到了一些困难。
由于交通标志的颜色可能不同,所以我希望先检测标志的形状。
我试图首先找到所有轮廓并尝试检测每个轮廓的形状。但是,标志的轮廓不够清晰,并且树背景包含许多会影响检测的小轮廓。使程序无法找到交通标志的完整轮廓。我知道使用 openCV 中的 fastNlMeansDenoisingColored() 可以显着消除噪声并使检测变得更加准确。但是对于实时处理来说太慢了。
我不仅要检查圆形标志,还要检查三角形或四边形标志。因此,我希望先找到所有物体的轮廓,并尝试检查物体的形状。
这是我用来查找图片内部轮廓的代码,它是结果。我要开发一个iOS应用程序,所以它是在objective-c中的。
- (cv::Mat)findSigns:(cv::Mat)src {
Mat edge;
Mat src_gray;
cvtColor(src, src_gray, COLOR_RGB2GRAY);
medianBlur(src_gray, src_gray, 5);
Canny(src_gray, edge, 80, 80, 3);
Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3,3));
Mat dilated;
cv::dilate(edge, dilated, kernel);
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
RNG rng(12345);
cv::findContours(edge, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
Scalar color = Scalar(255, 0, 255);
for(int i = 0; i<contours.size(); i++){
std::vector<cv::Point> c = contours[i];
double area = cv::contourArea(c);
if (area > 100) {
drawContours(src, contours, i, color, 2, 8, hierarchy);
}
}
edge.release();
src_gray.release();
kernel.release();
dilated.release();
return src;
}
src图片:
由于轮廓太多,所以我尝试去除小面积的轮廓。这是结果。
此外,我还尝试检查 hierarchy[i][2] == -1 是否有任何闭合轮廓。但它们都等于-1。
请问我应该如何检测交通标志的形状?我应该通过移除绿色对象来移除树背景以便于检测吗?
解决方案
要正确检测轮廓,您需要先对图像进行平滑处理。
请检查链接以供参考。链接:http ://answers.opencv.org/question/164533/how-to-smooth-the-edges-of-a-low-quality-image/
推荐阅读
- python - 使用 Boto3 以编程方式获取 IAM 用户的 UserID
- php - 如何在PHP中的图片上写不透明的文本?
- python - NameError:名称“max_pool2D”未定义
- c# - ListView 列大小随内容而变化
- c# - AutoMapper 中派生类型的共享映射
- excel - 使用 vba 发送邮件时,嵌入图片未显示在 gmail 正文中
- java - 从 .txt 文件中提取两个不同类的对象到它们关联的 ArrayList
- reactjs - ./src/index.js 未找到模块:无法解析 '~antd/dist/antd.css'
- javascript - 在 React 中为命名函数获取“import/no-anonymous-default-export”警告
- ios - 在 iOS 中更改设备时间后未触发本地通知