一、发文初衷

        在贴片机研发中,圆形识别是一个非常重要的课题,PCB的mark识别,BGA芯片对位的焊盘识别,带料的孔洞识别,吸嘴对准识别,换吸嘴机构定位识别,等等不胜枚举的场景中,都要用的圆形识别,圆形识别重要性可见一斑。

        “别人一开源,我们就自主”的无耻之徒,让有开源信仰的人们,深恶痛绝。“弯道超车”的谎言,就像皇帝新衣一样,丑陋愚蠢。没有踏踏实实基础科学研究,怎么可能拥有创新超车的能力。正如opencv库一样,对图像数学建模能力和计算机编程能力有超高的要求,这样的人才应该是我们尊重和崇拜的对象,更应该对这种开源无私的精神加以保护。但遗憾的是,带着金丝边眼镜的叫兽们,却二次封装opencv后,到处兜售,以“guo产”、“自研”,“love国”道德绑架,脑满肠肥的外表,致命地腐蚀着对我们科研的发展进步。

二、应用场景

        如图所示,PCB的Mark点,吸嘴,BGA焊盘,元件编带,贴片机点位螺丝,等等,都有圆形状元素,opencv视觉库对应此类需求,非常简单就可实现。

三、opencv算法过程

        本文以元件料带的圆孔为例,一般料带孔据为4mm,只要我们识别到料带孔位置,我们可以准确推算出元件的位置。

        1、读取图像并转灰

    //读取图像
    cv::Mat src;
    src = cv::imread("tape.jpg");
    //图像转灰度
    cv::Mat gray;
    cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY); // 灰度化

         2、中值滤波

    //中值滤波
    cv::Mat median;
    cv::medianBlur(gray, median, 3); // 中值滤波去除噪声

        3、边缘检测

    //边缘检测
    Mat edges;
    cv::Canny(median, edges, 100, 200, 3, false);
    imshow("edges", edges);

        4、高斯滤波

    //高斯滤波
    Mat gaussian;
    cv::GaussianBlur(edges,gaussian,cv::Size(5,5),0);
    imshow("gaussian", gaussian);

        5、霍夫圆检测

    //霍夫圆检测  1, 50, 80, 80, 50, 200
    std::vector<Vec3f> pcircles;
    cv::HoughCircles(gaussian, pcircles, CV_HOUGH_GRADIENT, 1,
                     10,
                     80,20,
                     15,
                     25);

         6、画出检测圆

    for (size_t i = 0; i < pcircles.size(); i++) {
        Vec3f cc = pcircles[i];
        //画圆
        circle(src, Point(cc[0], cc[1]),  cc[2], Scalar(0,0,255), 1, LINE_AA);
        qDebug()<<"radiues="<< cc[2];
        //画圆心
        circle(src, Point(cc[0], cc[1]), 2, Scalar(127,255,127), 1, LINE_AA);
    }
    imshow("src", src);

        图中为灰度处理的料带,边缘检测,霍夫圆检测的三个截图

        这种圆形检测方法,具有普遍适用性,只要稍微调整,即可完成不同场合圆形检测。opencv的视觉库非常强大,还有很多有用的功能,可以应用于贴片机视觉识别中。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐