前言

目前地铁上检修螺丝后,会涂抹一种红色标记线,来代表检测完成,日后检修员就可以通过肉眼来观察螺丝是否松动,这样可以大大提高检修的效率问题。所以我们参照这个思路,通过opencv来实现螺丝是否松动检测。

   

正文

  1. 首先我们通过目标检测算法,识别出图像中螺丝的区域。这里不实现了就,自行通过yolo等算法实现。
  2. 识别出目标区域后,我们首先提取图像中的红色区域(假设我们用红色标记)
    void extract_red_area(const cv::Mat &image, cv::Mat &redMat) {int width = image.cols;int height = image.rows;int x, y;double B = 0.0, G = 0.0, R = 0.0, H = 0.0, S = 0.0, V = 0.0;redMat = Mat::zeros(image.size(), CV_8UC1);for (x = 0; x < height; x++){for (y = 0; y < width; y++){B = image.at<Vec3b>(x, y)[0];G = image.at<Vec3b>(x, y)[1];R = image.at<Vec3b>(x, y)[2];RGB2HSV(R, G, B, H, S, V);//红色范围,范围参考的网上。可以自己调if ((H >= 312 && H <= 360) && (S >= 17 && S <= 100) && (V > 18 && V < 100))redMat.at<uchar>(x, y) = 255;}}
    }

          

  3. 提取红色区域轮廓信息,这里我们需要过滤一些,因为有一些轮廓是我们不需要的。(根据实际情况来过滤)

       // 2.提取轮廓std::vector<std::vector<cv::Point>> contours;std::vector<cv::Vec4i> hierarchy;cv::findContours(redMat,               // 输入二值图contours,             // 存储轮廓的向量hierarchy,            // 轮廓层次信息RETR_TREE,            // 检索所有轮廓并重建嵌套轮廓的完整层次结构CHAIN_APPROX_NONE);   // 每个轮廓的全部像素printf("find %d contours \n", contours.size());
    // 过滤轮廓
    void filter_contours(std::vector<cv::Vec4i> &hierarchy, std::vector<std::vector<cv::Point>> &contours) {std::vector<std::vector<cv::Point>>::iterator itc = contours.begin();std::vector<cv::Vec4i>::iterator itc_hierarchy = hierarchy.begin();int i = 0;int min_size = 20;int max_size = 500;while (itc_hierarchy != hierarchy.end()){//验证轮廓大小//if (!(hierarchy[i][2] < 0 && hierarchy[i][3] < 0)) // 存在子轮廓/父轮廓if (hierarchy[i][3] > 0) // 存在父轮廓{itc = contours.erase(itc);itc_hierarchy = hierarchy.erase(itc_hierarchy);}else{//验证轮廓大小if (itc->size() < min_size || itc->size() > max_size){itc = contours.erase(itc);itc_hierarchy = hierarchy.erase(itc_hierarchy);}else{++itc;++itc_hierarchy;}++i;}}
    }
  4. 提取每一个轮廓的最小外接矩形,并绘制最小外接矩形的每条边和中心点,并计算每一个区域的角度,最后通过每一个区域的角度来判断是否对齐。

    void draw_center(cv::Mat &dstImg, std::vector<std::vector<cv::Point>> &contours, std::vector<cv::Point> &vec) {std::vector<RotatedRect> box(contours.size()); //定义最小外接矩形集合Point2f rect[4];for (int i = 0; i < contours.size(); i++){box[i] = minAreaRect(Mat(contours[i])); cv::circle(dstImg, Point(box[i].center.x, box[i].center.y), 2, cv::Scalar(0, 255, 255), cv::FILLED);box[i].points(rect);for (int j = 0; j < 4; j++){line(dstImg, rect[j], rect[(j + 1) % 4], Scalar(255, 0, 255), 1, 8);  //绘制最小外接矩形每条边}std::cout << "angel:" << box[i].angle << std::endl;}
    }

5. 以上差不多就是大概实现过程。主要实现思路就是: 识别螺丝 -> 提取红色区域 -> 识别轮廓 -> 筛选轮廓 -> 计算最小外接矩形、中心点、角度 -> 通过角度来判断是否对齐,从而来判断螺丝是否松动。

    

demo:基于opencv,实现螺丝防松动检测_螺丝松动检测-互联网文档类资源-CSDN下载

最后

以上实现思路都是个人想法,所以如果有小伙伴有更好的算法,欢迎楼下留言,非常感谢。最后祝大家新年快乐,在新的一年里工作顺利,技能大长。

基于opencv ,实现螺丝松动检测相关推荐

  1. Python基于OpenCV的实时疲劳检测[源码&演示视频&部署教程]

    1.图片演示 2.视频演示 [项目分享]Python基于OpenCV的实时疲劳检测[源码&演示视频&部署教程]_哔哩哔哩_bilibili 3.检测方法 1)方法 与用于计算眨眼的传统 ...

  2. 运用特征脸方法的基于Opencv的猫脸检测实现

    本文禁止转载.抄袭,请尊重作者权利. 使用特征脸方法的基于Opencv的猫脸检测实现 摘要 目前,在计算机视觉和模式识别领域,脸识别技术是一个很活跃的课题,人脸识别的方法已经十分丰富,而对于日常生活中 ...

  3. 基于OpenCV的条形码区域检测(一)

    基于OpenCV的条形码区域检测(一) 1.已有方案  能够很轻松地在网上找到这一篇文章<使用Python和OpenCV检测图片上的条形码_Adrian Rosebrock>,原文:'De ...

  4. 基于Opencv的车距检测系统(源码&教程)

    1.研究背景 对本车前方车辆的识别及距离检测是计算机视觉技术在智能网联汽车中的一个重要内容.要想在错综繁杂的交通环境中实现无人驾驶,对行车环境中其他车辆信息的获取是十分重要的.因此,对本车前方车辆的识 ...

  5. 基于OpenCV的混凝土裂纹检测

    基于OpenCV的混凝土裂纹检测 前言 这是我发的第一次博客,有什么建议大家可以给我留言,感激不尽! 接下来,我们进入正题. 一.使用函数库 numpy, opencv, heapq, skimage ...

  6. Python基于OpenCV的异常行为检测系统[源码&部署教程]

    1.项目背景 智能视频监控(Intelligent Video Surveillance , IVS)[1.2·3.4是计算机视觉技术5l在安防领域的应用,实现了由"被动监控"到& ...

  7. RIKIBOT使用系列-基于Opencv HSV的色块检测

    目录 一. 简介 二.查找色值 1.摄像头的角度调 2.启动检测与查找 三. 验证HSV色值 1.写入色值到文件 2.启动检测 四.交流方式 一. 简介 这里学习一下如何用摄像头检测HSV色值,Ope ...

  8. 基于OpenCV监控老鼠蟑螂检测系统[完整源码&部署教程]

    1.视频演示: [项目分享]Python基于OpenCV监控老鼠蟑螂检测系统[完整源码&部署教程]_哔哩哔哩_bilibili 2.图片演示: 3.算法原理: 该博客提出的移动侦测即是根据视频 ...

  9. Python基于OpenCV监控老鼠蟑螂检测系统[完整源码&部署教程]

    1.视频演示: [项目分享]Python基于OpenCV监控老鼠蟑螂检测系统[完整源码&部署教程]_哔哩哔哩_bilibili 2.图片演示: 3.明厨亮灶: 餐饮企业的厨房卫生状况一直饱受消 ...

  10. 基于OpenCV实战:车牌检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 拥有思维导图或流程将引导我们朝着探索和寻找实现目标的正确道路的方向 ...

最新文章

  1. UITableView注意点
  2. 答疑:U盘突然无法识别了,数据还能恢复吗
  3. flutter 环境搭建
  4. 读spring源码(一)-ClassPathXmlApplicationContext-初始化
  5. 惊呆了!不改一行 Java 代码竟然就能轻松解决敏感信息加解密
  6. Java+sql server+CallableStatement调用存储过程三种情况 (转)
  7. java w732_技术联盟W732系统下载
  8. 关于c/c++语言中*和*使用的详细分析
  9. c语言比赛积分程序,C语言积分赛.doc
  10. 如何在Swiper内制作CSS3动画效果
  11. Java实用教程(第5版)参考答案
  12. python3.6+Appium实现手机微信自动回复
  13. Android-jsoup爬虫
  14. 一个简单的文本编辑程序源代码
  15. Unity关于屏幕适配留黑边的做法
  16. Flask:使用蓝图来改进项目
  17. 无胁科技-TVD每日漏洞情报-2022-12-12
  18. Qt Quick实现的涂鸦程序
  19. 用java写篮球弹跳_篮球怎么在家练弹跳?
  20. win10设置虚拟内存_大内存时代,电脑系统还需要设置虚拟内存吗?

热门文章

  1. 华为太极magisk安装教程_怎么升级Magisk到最新19.4版本-正确刷入Magisk,获取ROOT教程...
  2. 心得-计算机软考之嵌入式系统工程师
  3. linux查看服务器cpu主频,linux 下查看服务器CPU的信息
  4. Linux终端收听mms流媒体电台
  5. nginx静态资源优化配置方法
  6. 【web前端】20.手机端网页禁止长按图片保存图片
  7. 图像处理-图像边缘处理
  8. win10设置宽带拨号断线重连
  9. 校验、加密、压缩、哈希值的区别,我老是弄混,现在总结一下
  10. 自适应Simpson法P4525 【模板】自适应辛普森法1