Kithara与OpenCV (二)

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.mzph.cn/bicheng/45687.shtml

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

相关文章

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

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

如何更好的优化 ListView 控件的性能

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD&#xff0c;日常还会涉及Android开发工作。 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起…

MongoDB教程(四):mongoDB索引

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、MongoD…

windows查看局域网所有设备ip

windows如何查看局域网所有设备ip 操作方法 一 . 在搜索栏里输入cmd 二 .在命令行黑窗口输入arp -a 三 . 最上面显示的动态地址就是所有设备ip

IOS上微信小程序密码框光标离开提示存储密码解决方案

问题&#xff1a; ios密码框输入密码光标离开之后会提示存储密码的弹窗 解决方案 1、在苹果手机上面把 “自动填充密码”关闭&#xff0c;但是苹果这个默认开启&#xff0c;而且大部分客户也不会去自己关闭。 2、欺骗苹果手机&#xff0c;代码实现。 先说解决思路&#xf…

80. UE5 RPG 实现UI显示技能冷却进度功能

在上一篇文章里&#xff0c;我们实现了通过GE给技能增加资源消耗和技能冷却功能。UI也能够显示角色能够使用的技能的UI&#xff0c;现在还有一个问题&#xff0c;我们希望在技能释放进去冷却时&#xff0c;技能变成灰色&#xff0c;并在技能冷却完成&#xff0c;技能可以再次使…

在Anaconda环境中安装TensorFlow+启动jupyter notebook

1.打开cmd&#xff0c;输入C:\Users\xy>conda create -n tensorflow python3.7 这是在环境中创建了一个名为tensorflow的环境&#xff0c;具体会显示以下信息&#xff1a; C:\Users\xy>conda create -n tensorflow python3.7 Retrieving notices: ...working... done Co…

Python实战Elasticsearch的核心技巧详解

概要 Elasticsearch 是一个分布式的搜索引擎,可以用于全文搜索、结构化搜索、分析等多种场景。它基于Lucene构建,提供了强大的搜索功能和数据分析能力。本文将详细介绍如何使用Python实现与Elasticsearch的交互,包括安装、配置、基本操作和实际应用示例。 安装和配置 安装…

centos单机配置多个内网IP地址

centos单机配置多个内网IP地址 引配置1. 查看当前网络IP配置2. 打开网络配置目录3. 设置静态IP4. 编辑ifcfg-eno1:15. 重启网络配置 引 同一个局域网&#xff0c;但是对接的多个子系统使用了不同的网段&#xff0c;如一个系统主机IP地址是192.168.10.1&#xff0c;另一个系统主…

基于B站视频评论的文本分析,采用包括文本聚类分析、LDA主题分析、网络语义分析

研究主题 本研究旨在通过对B站视频评论数据进行文本分析&#xff0c;揭示用户评论的主题、情感倾向和语义结构&#xff0c;助力商业决策。主要技术手段包括Python爬虫、LDA主题分析、聚类分析和语义网络分析。首先&#xff0c;利用Python爬虫采集大量评论数据并进行预处理。运…

npm发布的包如何快速在cnpm上使用

npm发布的包如何快速在cnpm上使用 解决方案 前往淘宝npm镜像官网 搜索插件库并点击同步 等待一分钟即可查看最新版本

linux进程周边知识——内核对硬件的管理——计算机世界的管理

前言&#xff1a;本节主要讲解内核也就是操作系统对于硬件的管理&#xff0c; 本节内容同样为进程的周边知识。 主要是关于软件方面&#xff0c; 和我的上一篇——冯诺依曼体系结构可以说是兄弟文章&#xff0c; 这篇文章主要是关于硬件方面。 两篇文章都是为学习进程做准备。但…

小程序创建与项目初始化(构建 npm + 集成 Sass)

一、打开微信开发者工具 确认 左侧导航栏是否选中的 小程序点击 【】创建小程序 二、创建小程序 三、初始化 清空 app.wxss、app.js 去掉 rendererOptions 和 componentFramework 不需要最新的搜索引擎 留下以下文件 四、自定义构建 npm 集成 Sass 首先 先把小程序源…

Go 高效Web开发框架 Echo

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

WEB前端01-HTML5基础(01)

一.WEB相关概念 软件架构 C/S: Client/Server &#xff08;客户端/服务器端&#xff09;&#xff1a;在用户本地有一个客户端程序&#xff0c;在远程有一个服务器端程序 优点&#xff1a;用户体验好 缺点&#xff1a;开发、安装&#xff0c;部署&#xff0c;维护麻烦 B/S: Br…

Qt Qml编程 基础部分 认识qml

学习目标&#xff1a;认识Qml编程 学习内容 qml介绍 Qt QML 是一个用来设计和开发Qt应用程序用户界面的声明性语言。QML 是 Qt 的元对象语言(Meta-Object Language)的缩写。它与 C 一起使用,来为 Qt 应用程序创建用户界面。 QML 是一个标记语言,它允许开发人员使用类似 HTM…

Chapter 1:数据结构前言

在数字化的世界里&#xff0c;我们每天都在与数据打交道。然而&#xff0c;你是否曾想过&#xff0c;这些数据是如何被组织、存储和处理的&#xff1f;这就是数据结构的魅力所在。 数据结构&#xff0c;简单来说&#xff0c;就是数据的组织方式。它决定了我们如何高效地访问和操…

sublime text中的配置好用的报错插件,代码检查插件sublimelinter,cppcheck,对C++的环境进行配置-2024.7.13版

文章目录 一&#xff0c;sublimelinter能实现什么&#xff1f;二、sublimelinter 的安装教程配置sublime text 的基础环境配置cppcheck的环境变量配置sublimelinter的配置文件 一&#xff0c;sublimelinter能实现什么&#xff1f; 因为sublime 不自带任何的代码检查工具&#…

理解CNN中的Batch Normalization (补充 知乎博主)

理解CNN中的Batch Normalization - 知乎 (zhihu.com) https://zhuanlan.zhihu.com/p/403073810 BN层常见有针对1d特征&#xff08;全连接层后面的&#xff09; 举一个简单的例子吧 解释在全连接层&#xff08;Fully Connected Layer, FC Layer&#xff09;后加 BN 层时&#…

基于Adaboost的数据分类算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于Adaboost的数据分类算法matlab仿真,分别对比线性分类和非线性分类两种方式。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 &#xff08;完整程序…