Kithara与OpenCV (二)

Kithara使用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 时间有效
    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独占技术,即使在Windows负载较高的情况下,也能够稳定地处理OpenCV对图像中圆的检测任务并输出结果。这种稳定性确保了在各种工作负载下,检测任务都能保持一致的性能表现。此外,我们还对不同平台对检测任务的影响进行了测试,进一步验证了Kithara Windows实时套件在多种环境中的优越性能。这些测试结果表明,无论平台和负载如何,该套件都能提供可靠、高效的图像处理能力。
在这里插入图片描述
在进行相同的检测任务时,我们发现抖动现象存在显著差异,这表明用于性能检测的CPU在图像处理方面具有一定的影响。此外,在测试过程中我们还注意到,不同的算法和图像的复杂度也会对结果产生影响。这些因素综合作用,揭示了在图像处理任务中,硬件和软件的选择对性能的最终表现有着重要的决定性作用。通过深入分析这些变量,我们可以更好地优化检测系统,从而提高整体的处理效率和准确性。

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kithara Codesys是一种实时操作系统(RTOS)和编程环境,用于开发嵌入式控制应用程序。该软件是由德国Kithara Software开发的,旨在提供高性能和稳定性,以满足工业自动化和机器控制领域的需求。 Codesys是一种广泛使用的工业自动化开发环境,它提供了一个集成的开发工具和库,用于创建和管理PLC(可编程逻辑控制器)应用程序。而Kithara Codesys则是在Codesys基础上,结合了Kithara实时操作系统的特性和功能。 Kithara Codesys在实时性能方面表现出色,能够处理实时应用程序的严格时间要求。它提供了具有优先级调度的多任务支持,可以同时管理多个并发任务,并确保各个任务按照预定的时间间隔和优先级进行执行。这种实时性能是在Kithara实时操作系统的基础上实现的,它提供了低延迟的中断处理和实时任务调度,确保应用程序对外部输入的及时响应。 Kithara Codesys还具有灵活的硬件支持,支持多种不同的硬件平台和接口。它可以与各种专用硬件设备和传感器进行连接,并通过标准的PLC编程语言进行控制和通信。这使得开发人员可以根据自己的需求选择合适的硬件平台,以实现最佳的控制和自动化方案。 总的来说,Kithara Codesys是一种强大的嵌入式控制开发环境,结合了Codesys的功能和Kithara实时操作系统的实时性能。它在工业自动化领域有广泛的应用,能够满足各种复杂的控制需求,并提供稳定可靠的运行环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值