Kithara与OpenCV (二)

news2024/9/22 19:26:21

Kithara使用OpenCV + QT 进行特征检测


目录

    • Kithara使用OpenCV + QT 进行特征检测
      • OpenCV 特征检测简介
      • Qt应用框架简介
      • 项目说明
      • 关键代码
      • 抖动测试
          • 测试平台:
          • 测试结果:
          • 结论


OpenCV 特征检测简介

OpenCV是一个开源的计算机视觉库,提供了各种图像处理和计算机视觉算法的实现。特征检测是其中重要的功能之一。

特征检测是一种在图像中寻找关键点或感兴趣区域的技术。这些关键点通常具有以下特征:边缘、角点、斑点等。特征检测算法可以帮助我们定位和识别图像中的物体以及进行图像配准、目标跟踪等应用。

OpenCV提供了多种特征检测算法的实现,包括SIFT、SURF、ORB等。其中,SIFT(尺度不变特征变换)和SURF(速度ed特征变换)是两种常用的基于局部特征的算法,它们具有尺度不变性和旋转不变性,适用于广泛的图像变换和缩放操作。ORB(Oriented FAST and Rotated BRIEF)是一种结合了FAST关键点检测器和BRIEF描述符的快速算法,适用于实时应用。

特征检测的步骤通常包括关键点检测、关键点描述和匹配。关键点检测是在图像中找到具有显著性质的点,如边缘、角点等。关键点描述是为每个关键点生成一个描述符,用于表示其局部特征。匹配是将两个图像中的关键点进行配对,找到相对应的点对。

特征检测在计算机视觉领域有广泛的应用,如图像配准、目标识别、物体检测、增强现实等。通过使用OpenCV提供的特征检测算法,可以方便地实现这些应用。

关于Kithara如何调用OpenCV,以及如何编译适用于Kithara的OpenCV开发库可以查看 Kithara与OpenCV (一)

Qt应用框架简介

Qt是一个跨平台的C++应用程序开发框架。它提供了一套丰富的库和工具,用于开发图形用户界面(GUI)应用程序、网络应用程序和嵌入式应用程序,由于本章文章重点并不是Qt,所以就不展开说明,如果对Qt感兴趣,可以去Qt官网或者其他博客。

项目说明

使用Kithara Windows实时套件和OpenCV的组合,可以进行圆形检测,并结合Qt图形化应用框架实时显示检测图像,可以选择不同网口的摄像头和调节检测圆的参数,并测试处理抖动。

编写流程:

  1. 导入Kithara Windows实时套件和OpenCV库。
  2. 使用Qt图形化应用框架创建一个界面,包括一个图像显示区域和参数调节区域。
  3. 初始化Kithara并打开摄像头,开始实时获取图像。
  4. 在任务处理中,将实时获取的图像传递给OpenCV进行圆形检测。
  5. 根据检测结果,在图像上绘制圆形,并通过共享内存j将数据回传到应用层将图像实时显示在界面的图像显示区域中。
  6. 在参数调节区域中,添加可调节的参数,如圆形半径、最小阈值等,通过滑动条或输入框来修改参数。
  7. 当参数发生变化时,重新进行圆形检测,并在图像上实时显示检测结果。
  8. 可以添加其他功能,进行扩展。
  9. 结束时,释放资源和关闭摄像头。

在这里插入图片描述

关键代码

// 这是实时任务将运行的函数,并对接收到的图像执行 OpenCV 操作。只有实时任务才应调用 OpenCV 函数。
KSError __stdcall OpenCVcallback(void * /*pArgs*/, void * /*pContext*/)
{
    // 在内核层模式下自动并行化 OpenCV 可能会与您的实时应用程序冲突。 建议关闭自动并行化,除非真的需要
    // 禁用并行化
    cv::setNumThreads(0);

    // 表示已准备好处理图像。
    krenel_data_ptr_->ready = 1;

    // 图形抖动性测试
    int64 last_diff_time {0};
    int is_valid_time = 0;  // 时间是否有效 0 无效 1 时间有效 2 时间差有效
    int count = 0;  // 计数器
    int64 jitter_time_sum {0};  // 抖动总时间

    // 处理循环,此循环仅在发出中止信号时停止。
    for (;;)
    {
        // 等待图像接收或停止的通知。
        KSError error = KS_waitForEvent(krenel_data_ptr_->image_received_event_handle, KSF_NO_FLAGS, 0);
        if (error != KS_OK) { KS_printK("KS_waitForEvent failed! \n"); }
        if (krenel_data_ptr_->abort != 0) { break; }

        // 计数器
        count++;
        // 获取当前时间,用于计算图像处理的抖动时间
        int64 last_time {0};
        error = KS_getClock(&last_time, KS_CLOCK_MEASURE_HIGHEST);
        if (error != KS_OK) { return error; }

        // 获取接收到的图像数据的缓冲区
        KSCameraBlock *camera_block;
        void *image_data;
        error = KS_recvCameraImage(krenel_data_ptr_->stream_handle, &image_data, &camera_block,KSF_NO_FLAGS);
        if (error != KS_OK)
        {
            krenel_data_ptr_->ready = 1;
            continue;
        }

        //如果接收到的块类型不是图像,我们跳过。在任何情况下,如果 KS_recvCameraImage() 成功接收到的缓冲区必须使用 KS_releaseCameraImage() 释放。
        if (camera_block->blockType != KS_CAMERA_BLOCKTYPE_IMAGE)
        {
            KS_releaseCameraImage(krenel_data_ptr_->stream_handle, image_data, KSF_NO_FLAGS);
            break;
        }

        // 在构建 OpenCV cv::Mat 之前,请检查接收到的图像是否具有正确的像素格式。
        const auto *image_block = reinterpret_cast<KSCameraImage *>(camera_block);
        // 图像转换
        cv::Mat image = CreateMat(image_block->height, image_block->width, image_block->pixelFormat, image_data, image_block->linePadding);

        // 圆形检测
        image = CircleDetect(krenel_data_ptr_->check_circle_param, image);

        error = KS_releaseCameraImage(krenel_data_ptr_->stream_handle, image_data, KSF_NO_FLAGS);
        if (error != KS_OK) { KS_printK("KS_releaseCameraImage failed! \n"); }

        // 填充图像信息到共享内存中
        krenel_data_ptr_->image_info.image_height = image.rows;
        krenel_data_ptr_->image_info.image_width = image.cols;
        krenel_data_ptr_->image_info.pixel_format = image_block->pixelFormat;

        if (image_block->pixelFormat == KS_CAMERA_PIXEL_MONO_8)
        {
            KS_memCpy(pixel_buffer_, image.data, (int) image.cols * image.rows, KSF_NO_FLAGS);
        }
        else if (image_block->pixelFormat == KS_CAMERA_PIXEL_BGR_8)
        {
            KS_memCpy(pixel_buffer_, image.data, (int) image.cols * image.rows * 3, KSF_NO_FLAGS);
        }

        //  图形处理完成后,减去上次处理完成的时间
        int64 time {0};
        error = KS_getClock(&time, KS_CLOCK_MEASURE_HIGHEST);
        if (error != KS_OK) { return error; }

        // 检测圆处理时间
        const int64 diff_time = time - last_time;

        int64 time_cyc = diff_time;
        KS_convertClock(&time_cyc, KS_CLOCK_MEASURE_HIGHEST, KS_CLOCK_MACHINE_TIME, KSF_NO_FLAGS);
        krenel_data_ptr_->jitter_value.time_cyc = time_cyc;

        if (is_valid_time == 0)
        {
            last_diff_time = diff_time;
            is_valid_time = 1;
        }
        else
        {
            // 处理时间的抖动
            const int64 jitter_time = diff_time - last_diff_time;
            int64 single_time = jitter_time;
            KS_convertClock(&single_time, KS_CLOCK_MEASURE_HIGHEST, KS_CLOCK_MACHINE_TIME, KSF_NO_FLAGS); // 100 ns 为单位
            last_diff_time = diff_time;
            jitter_time_sum += single_time;

            if (krenel_data_ptr_->jitter_value.lat_min > single_time)
            {
                krenel_data_ptr_->jitter_value.lat_min = single_time;
            }

            if (krenel_data_ptr_->jitter_value.lat_max < single_time)
            {
                krenel_data_ptr_->jitter_value.lat_max = single_time;
            }

            krenel_data_ptr_->jitter_value.lat_avg = jitter_time_sum / count;
            krenel_data_ptr_->jitter_value.cur_val = single_time;
        }

        krenel_data_ptr_->ready = 1;
    }
    return KS_OK;
}

抖动测试

测试平台:

在这里插入图片描述

测试结果:

在这里插入图片描述

结论

Kithara Windows实时套件得益于独占CPU处理OpenCV对图像中圆的检测,无论Windows负载如何,检测任务任能稳定处理。
我也同时测试了不同平台对检测任务的影响,如图:
在这里插入图片描述
可以同样的检测任务,抖动出现较大差异,说明性能检测的CPU对图像处理有一定的影响,测试过程中还发现,不同算法,图像的复杂度等均有一定影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1922756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WordPress 主题技巧:给文章页增加“谁来过”模块。

模块功能&#xff1a; 我个人目前在做一个电影类的网站&#xff0c;在开发文章页的模版时候&#xff0c;突然觉得给文章页增加一个“谁对本电影感兴趣”的功能模块可能会比较有趣&#xff0c;这个功能有点类似于‘足迹’的感觉&#xff0c;用户可以通过这个功能&#xff0c;发…

昇思25天学习打卡营第14天|K近邻算法实现红酒聚类

红酒Wine数据集 类别(13类属性)&#xff1a;Alcohol&#xff0c;酒精&#xff1b;Malic acid&#xff0c;苹果酸 Ash&#xff0c;灰&#xff1b;Alcalinity of ash&#xff0c;灰的碱度&#xff1b; Magnesium&#xff0c;镁&#xff1b;Total phenols&#xff0c;总酚&#xf…

tkinter-TinUI-xml实战(12)pip可视化管理器

引言 pip命令行工具在平常使用方面确实足够简单&#xff0c;本项目只是作为TinUI多界面开发的示例。 当然&#xff0c;总有人想用GUI版pip&#xff0c;实际上也有。不过现在&#xff0c;我们就来手搓一个基于python和TinUI&#xff08;tkinter&#xff09;的pip可视化管理器。…

102.qt qml-最全Table交互之多列固定、行列拖拽、自定义委托、标题交互使用教程

自定义实现的Table控件&#xff0c;支持跨qt版本&#xff0c;兼容qt5,qt6&#xff01; 截图如下所示: 黑色风格如下所示&#xff1a; 视频演示入口&#xff1a;Qt QML QianWindowV2.5(新增曲线综合示例、QML最全Table交互示例、支持qt5/qt6)_哔哩哔哩_bilibili 1.示例页面入口…

Python爬虫技术从去哪儿网获取旅游数据,对攻略进行可视化分析,提供全面的旅游攻略和个性化的出行建议

背景 随着信息技术的快速发展和互联网的普及&#xff0c;旅游行业也迎来了数字化和智能化的变革。去哪儿网作为中国领先的在线旅游平台之一&#xff0c;提供了丰富的旅游产品和服务&#xff0c;涵盖了机票、酒店、旅游度假等各个方面。用户通过去哪儿网可以方便地查询、预订和…

羧基聚乙二醇生物素的制备方法;COOH-PEG-Biotin

羧基聚乙二醇生物素&#xff08;COOH-PEG-Biotin&#xff09;是一种常见的生物分子聚合物&#xff0c;具有多种应用&#xff0c;特别是在生物实验、药物研发和生物技术等领域。以下是对该化合物的详细解析&#xff1a; 一、基本信息 名称&#xff1a;羧基聚乙二醇生物素&#x…

C/C++ 进阶(7)模拟实现map/set

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 一、简介 map和set都是关联性容器&#xff0c;底层都是用红黑树写的。 特点&#xff1a;存的Key值都是唯一的&#xff0c;不重复。 map存的是键值对&#xff08;Key—Value&#xff09;。 set存的是键…

一图展示免费开源的分布式版本控制系统​Git

文章目录 前言一、安装Git二、Git配置三、git命令 前言 Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 一、安装Git Windows操作系统…

端到端拥塞控制的本质

昨天整理了一篇 bbr 的微分方程组建模(参见 bbr 建模)&#xff0c;算是 bbr 算法终极意义上的一个总结&#xff0c;最后也顺带了对 aimd 的描述&#xff0c;算是我最近比较满意的一篇分享了。那么接下来的问题&#xff0c;脱离出具体算法&#xff0c;上升到宏观层面&#xff0c…

【Redis】复制(Replica)

文章目录 一、复制是什么&#xff1f;二、 基本命令三、 配置&#xff08;分为配置文件和命令配置&#xff09;3.1 配置文件3.2 命令配置3.3 嵌套连接3.4 关闭从属关系 四、 复制原理五、 缺点 以下是本篇文章正文内容 一、复制是什么&#xff1f; 主从复制 master&#xff…

【UE5.1 角色练习】15-枪械射击——子弹发射物

目录 效果 步骤 一、创建并发射子弹 二、优化子弹 效果 步骤 一、创建并发射子弹 1. 在前面的文章中&#xff08;【UE5.1 角色练习】06-角色发射火球-part1&#xff09;我们创建了蓝图“BP_Skill_FireBall” 这里我们复制一份命名为“BP_Ammo_5mm”&#xff0c;用于表示…

OpenAI终止对中国提供API服务,对国内AI市场产生重大冲击?

6月25日&#xff0c;OpenAI突然宣布终止向包括中国在内的国家地区提供API服务&#xff0c;本月9日这一政策已经正式生效了&#xff01; 有人说&#xff0c;这个事件给中国AI行业带来很大冲击&#xff01;是这样吗&#xff1f;在展开讨论前&#xff0c;我们先来看看什么是API服务…

详解如何通过稀疏向量优化信息检索

在信息检索方法的发展历程中&#xff0c;我们见证了从传统的统计关键词匹配到如 BERT 这样的深度学习模型的转变。虽然传统方法提供了坚实的基础&#xff0c;但往往难以精准捕捉文本的语义关系。如 BERT 这样的稠密检索方法通过利用高维向量捕获文本的上下文语义&#xff0c;为…

配置Maven并使用IDEA新建一个简单的Springboot项目

一.maven的配置 1.查看电脑上是否配置了maven ①使用快捷键“WinR”打开运行窗口&#xff0c;在窗口中输入cmd&#xff0c;点击确定进入黑色命令窗口 ②在命令行窗口中输入如下命令 mvn -version 如果出现下面的提示则表示该电脑已配置maven&#xff0c;否则需要进行maven配…

pdf工具

iLovePDF | 为PDF爱好者提供的PDF文件在线处理工具 https://www.ilovepdf.com/zh-cn 图片 pdf 合并成一个pdf也可以拆分

基于AT89C51单片机超声波水位液位控制系统设计(含文档、源码与proteus仿真,以及系统详细介绍)

本篇文章论述的是基于AT89C51单片机的1616点阵LED显示器字符滚动显示设计的详情介绍&#xff0c;如果对您有帮助的话&#xff0c;还请关注一下哦&#xff0c;如果有资源方面的需要可以联系我。 目录 设计任务与要求 原理图 仿真图 代码 系统论文 资源下载 设计任务与要求…

css横向滚动条支持鼠标滚轮

在做视频会议的时候&#xff0c;标准模式视图会有顶部收缩的一种交互方式&#xff0c;用到了横向滚动&#xff1b;一般情况下鼠标滚轮只支持竖向滚动&#xff0c;这次写个demo是适配横向滚动&#xff1b; 效果图展示 实现横向滚动条顶部显示 <div className{style.remote_u…

【C++基础】初识C++(2)--引用、const、inline、nullptr

目录 一、引用 1.1 引用的概念和定义 1.2 引用的特性 1.3引用的使用 1.4 const引用 1.5 指针和引用的关系 二、inline 三、nullptr 一、引用 1.1 引用的概念和定义 引⽤不是新定义⼀个变量&#xff0c;⽽是给已存在变量取了⼀个别名&#xff0c;编译器不会为引⽤…

打造你的智能家居指挥中心:基于STM32的多协议(zigbee、http)网关(附代码示例)

1. 项目概述 随着物联网技术的蓬勃发展&#xff0c;智能家居正逐步融入人们的日常生活。然而&#xff0c;市面上琳琅满目的智能家居设备通常采用不同的通信协议&#xff0c;导致不同品牌设备之间难以实现互联互通。为了解决这一难题&#xff0c;本文设计了一种基于STM32的多协…

IOT物联可编程中控主机同时具备中控主机和交换机的功能

可编程中控主机同时具备中控主机和交换机的功能 GF-MAXCCP可编程中控主机确实同时具备中控主机和交换机的功能&#xff0c;这种设备在现代化会议室、音视频系统及其他集中控制场景中发挥着重要作用。以下是关于GF-MAXCCP可编程中控主机具备中控主机和交换机功能的详细解释&…