基于OpenCV的自动报靶识别实验

这篇具有很好参考价值的文章主要介绍了基于OpenCV的自动报靶识别实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题

户外胸环靶自动报靶问题,目前是通过声电等方式来识别,成本较高,本文尝试使用图像处理的方法来识别。
基于OpenCV的自动报靶识别实验

方案

前提:固定相机

  1. 确定靶子的四个顶点:目前使用人工手动标注,暂不考虑自动,这步尤为关键直接影响后续弹孔位置确定
  2. 提取靶子:透视变换
  3. 寻找最新的弹孔:a)优先图像处理 + 帧差,需要像素级对齐,b)深度学习检测器,需要收集训练数据,对粘连弹孔检测效果未必理想
  4. 寻找同心圆圆心:椭圆检测方法,https://github.com/memory-overflow/standard-ellipse-detection
  5. 依据圆心与弹孔的距离确定环数

实验

  1. 手动确定靶子四个顶点:
    坐标如下:
const std::vector<cv::Point2f> src_points = {{241,  0}, {417,  2145}, {3325, 0}, {3209, 2157}};
const std::vector<cv::Point2f> dst_points = {{0,   0}, {0,   500}, {500, 0}, {500, 500}};
  1. 提取靶子
    利用opencv提供的透视变换
cv::Mat M = cv::getPerspectiveTransform(src_points, dst_points);
cv::Mat target1, target2;
cv::warpPerspective(img1, target1, M, cv::Size(500, 500));
cv::warpPerspective(img2, target2, M, cv::Size(500, 500));

效果:
基于OpenCV的自动报靶识别实验

  1. 寻找最新弹孔
    先进行灰度化 -> 进行中值滤波减少噪声干扰 -> 二值化,弹孔明显黑于其它
	// 灰度
    cv::Mat gray1_, gray2_;
    cv::cvtColor(target1, gray1_, cv::COLOR_BGR2GRAY);
    cv::cvtColor(target2, gray2_, cv::COLOR_BGR2GRAY);
    // 中值滤波
    cv::Mat gray1, gray2;
    cv::medianBlur(gray1_, gray1, 5);
    cv::medianBlur(gray2_, gray2, 5);
    // 二值化
    cv::Mat bin1, bin2;
    cv::threshold(gray1, bin1, 90, 255, cv::THRESH_BINARY_INV);
    cv::threshold(gray2, bin2, 90, 255, cv::THRESH_BINARY_INV);

二值化效果:
基于OpenCV的自动报靶识别实验
帧差结果,仍然有些对齐误差或者图像退化导致的像素差异:

cv::Mat diff = bin2 - bin1;

效果:
基于OpenCV的自动报靶识别实验
使用中值滤波去除误差影响,图像腐蚀膨胀也可以

    cv::medianBlur(diff, diff, 3); // 中值滤波滤除残差像素

效果:
基于OpenCV的自动报靶识别实验
寻找弹孔轮廓,计算图像中心矩确定弹孔中心点:

    cv::findContours(diff, contours, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);
    //计算图像矩
    std::vector<cv::Moments> mu(contours.size());
    std::vector<cv::Point2f> mc(contours.size());
    for (int i = 0; i < contours.size(); i++) {
        mu[i] = cv::moments(contours[i], false);
        mc[i] = cv::Point2f(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00);
        cv::circle(diff, mc[i], 1, cv::Scalar(0), -1);
    }

效果:
基于OpenCV的自动报靶识别实验
4. 寻找同心圆圆心:
椭圆检测方法,https://github.com/memory-overflow/standard-ellipse-detection

    std::vector<std::shared_ptr<Ellipse> > ells;
    bool success = detectEllipse(gray1_.data, gray1_.rows, gray1_.cols, ells);
    std::cout << ells.size() << std::endl;
    for (const auto& ell : ells) {
        std::cout << "coverage: " << ell->coverangle << ", goodness: " << ell->goodness << ", polarity: " << ell->polarity << std::endl;
        cv::ellipse(target1,
                cv::Point(ell->o.y, ell->o.x),
                cv::Size(ell->a, ell->b),
                rad2angle(PI_2 - ell->phi),
                0,
                360,
                cv::Scalar(0, 255, 0), 2, 8);

    }

效果:
基于OpenCV的自动报靶识别实验

结论

虽然可以通过图像处理的方法,确定弹孔和圆心的位置,从而换算出靶数;户外打靶很受环境因素影响,一套参数很难适用全部情况,且提取的同心圆有畸变影响靶数的准确,而且靶子的顶点自动定位是个较大的困难,如果相机视角再是不固定的情况,还得做像素级配准。文章来源地址https://www.toymoban.com/news/detail-478980.html

到了这里,关于基于OpenCV的自动报靶识别实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python实战】——Python+Opencv是实现车牌自动识别

    🍉CSDN小墨晓末: https://blog.csdn.net/jd1813346972    个人介绍: 研一|统计学|干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项,参与研究经费10w、40w级横向 该篇文章将以实战形式演示利用Python结合Opencv实现车牌识

    2024年03月11日
    浏览(63)
  • python opencv:批量识别拼接图片分界线并进行自动裁剪

    在网上找图片素材时,有很多的图片是长图片,在一张图片上拼接了许多张图片,而很多时候我们需要单张图片,此时就需要将长图进行裁剪,一般可以用图片工具进行简单裁剪,高级点可以采用ps进行切片处理,如果图片数量少还好说一旦有大量的图片需要裁剪就很繁琐并

    2024年02月11日
    浏览(53)
  • 基于opencv的模式识别——水果类别识别与计数

             非常感谢那些有趣而又认真无私地在为知识普及做出贡献的网络博主们。         此处特别感谢bilibili博主啥都会一点的研究生、CSDN博主YouCans、Pysource 博主Serjo以及freeCodeCamp.org将我真正带进了基于Python与Opencv库的计算机视觉领域的启蒙大门。         基于

    2024年02月04日
    浏览(115)
  • 基于opencv的手势识别

    大家好,我是一名本科生,我的主要学习方向是计算机视觉以及人工智能。按照目前的学习进度来说,我就是一小白,在这里写下自己编写的程序,与大家分享,记录一下自己的成长。 思路分析 获取图片,在图片中找到手,然后进行一系列的闭运算,降噪平滑处理,轮廓查

    2024年02月03日
    浏览(58)
  • 基于OpenCV 的车牌识别

    车牌识别是一种图像处理技术,用于识别不同车辆。这项技术被广泛用于各种安全检测中。现在让我一起基于 OpenCV 编写 Python 代码来完成这一任务。 车牌识别的相关步骤 1. 车牌检测:第一步是从汽车上检测车牌所在位置。我们将使用 OpenCV 中矩形的轮廓检测来寻找车牌。如

    2024年02月09日
    浏览(47)
  • 基于OpenCV的人脸识别

    目录 🥩 前言 🍖 环境使用 🍖 模块使用 🍖 模块介绍 🍖 模块安装问题: 🥩 OpenCV 简介 🍖 安装 OpenCV 模块

    2024年02月02日
    浏览(49)
  • 基于OpenCV的谷物颗粒识别

    这个程序旨在通过图像处理技术实现对颗粒的计数。主要运用了计算机视觉库OpenCV以及数值计算库NumPy,通过颜色分割、灰度处理、二值化、轮廓检测等步骤,最终达到统计颗粒数量的目的。 首先,在程序的开头导入了必要的库,包括OpenCV用于图像处理,NumPy用于数组操作,

    2024年01月20日
    浏览(47)
  • 基于opencv识别动态验证码

    背景: ​ 验证码可以分为静态验证码和动态验证码。静态验证码通常以 .png 、 .jpg 等静态图片格式结尾,而动态验证码一般以 .gif 格式结尾。一些更具挑战性的验证码是基于动态验证码的。 ​ 静态验证码是一张固定的图片,其中包含了随机生成的文本或图形等信息。用户需

    2024年03月14日
    浏览(51)
  • Python|OpenCV-实现自动“追踪并检测”视频中的人脸识别(14)

    前言 本文是该专栏的第15篇,后面将持续分享OpenCV计算机视觉的干货知识,记得关注。 在本专栏之前,笔者在文章《Python|OpenCV-实现检测人脸以及性别检测(12)》中,有详细介绍通过OpenCV实现对图像中的人物人脸进行性别以及人脸检测,对此领域感兴趣的同学,可直接点击翻阅

    2024年04月14日
    浏览(42)
  • 基于OpenCV提供的人脸识别算法LBPH实现人脸识别

    本文通过学习LBPH人脸识别算法,简要了解人脸识别技术的原理,实现人脸采集、训练人脸模型实现人脸识别。 OpenCV库自带的人脸级联分级器具有很好的人脸检测和人脸追踪效果,它是一个基于Haar特征的Adaboost级联分类器。特别注意,OpenCV库虽然自带人脸级联分级器,但是识

    2024年02月03日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包