服务器之家

服务器之家 > 正文

opencv实现机器视觉检测和计数的方法

时间:2021-11-08 14:28     来源/作者:唯有自己强大

引言

在机器视觉中,有时需要对产品进行检测和计数。其难点无非是对于产品的图像分割。

由于之前网购的维生素片,有时候忘了今天有没有吃过,就想对瓶子里的药片计数...在学习opencv以后,希望实现对于维生素片分割计数算法。本次实战在基于形态学的基础上又衍生出基于距离变换的分水岭算法,使其实现的效果更具普遍性。

基于形态学的维生素片检测和计数

整体思路:

  • 读取图片
  • 形态学处理(在二值化前进行适度形态学处理,效果俱佳)
  • 二值化
  • 提取轮廓(进行药片分割)
  • 获取轮廓索引,并筛选所需要的轮廓
  • 画出轮廓,显示计数

opencv实现:

int main(int argc, char** argv)
{
    Mat src, src_binary,dst,src_distance;
    src = imread("D:/opencv练习图片/维生素片机器视觉检测和计数.png");
    imshow("原图片", src);
    Mat kernel = getStructuringElement(MORPH_RECT, Size(16, 16), Point(-1, -1));
    morphologyEx(src, dst, MORPH_OPEN, kernel);
    imshow("形态学",dst);
    cvtColor(dst, dst, COLOR_RGB2GRAY);
    threshold(dst, src_binary, 100, 255, THRESH_OTSU);
    imshow("二值化", src_binary);
    vector<vector<Point>> contours;
    findContours(src_binary, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE, Point(0, 0));
    RNG rng(12345);
    double area;
    Point2i PL;
    for (size_t i = 0; i < contours.size(); i++)
    {
        area = contourArea(contours[i]);
        if (area < 500)continue;
        PL = contours[i].front();
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
        drawContours(src, contours, i, color, 2, 8);
        putText(src, to_string(i), PL, FONT_HERSHEY_COMPLEX, 1, color, 2);            
    }
    imshow("计数结果", src);
    waitKey(0);
    return 0;
}

效果展示:

opencv实现机器视觉检测和计数的方法

opencv实现机器视觉检测和计数的方法

opencv实现机器视觉检测和计数的方法

由上图可以看的,原图在经过形态学处理后,可以去除很多细节,简化后续的药片分割操作。

但是在计数结果图上发现,索引17号药片并没有完全分割(实际上修改形态学的结构元素尺寸(改为20*20)也可以完全分离这两个药片)。

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部