ARM应用之瑞芯微RK3568上使用QT+Opencv

这篇具有很好参考价值的文章主要介绍了ARM应用之瑞芯微RK3568上使用QT+Opencv。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

手上有一块RK3568板子,正好官方SDK提供了opencv和QT的环境,就整个QT+OPENCV的简单应用玩玩。老铁们可以从整个简单示例开始叠加复杂功能了。

  1. 配置编译文件

直接在qt的配置文件中添加opencv库即可。

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = usbcamera_gui
TEMPLATE = app
#LIBS += -L. -ljpeg
CONFIG +=gnu++11 -Wl,--allow-shlib-undefined
LIBS += -L. -lopencv_core -lopencv_objdetect -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgproc -lopencv_imgcodecs -lrknn_api -lOpenCL -lpthread
QTPLUGIN += qjpeg

LIBS += -L../../../../../../tools/pack/chips/sun8iw11p1/hal/gpu/fbdev/lib/ -lGLESv2

SOURCES += main.cpp\
        camera.cpp

HEADERS  += camera.h

FORMS    += camera.ui
  1. 处理图像

这里直接使用USB采集的图像进行处理。通过ioctl配置参数。就取了个640*480分辨来看看效果。

int camera::camera_init()
{
    int ret=0,i=0,count=0;
    struct v4l2_capability cap;
    struct v4l2_fmtdesc fmtdesc;
    struct v4l2_format format;
    struct v4l2_requestbuffers reqbuf;
    struct v4l2_buffer buf;

    fmtdesc.index = 0;
    fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    ret = ::ioctl(fd, VIDIOC_G_FMT, &format);
    if(ret < 0){
        perror("VIDIOC_G_FMT");
        exit(1);
    }

    printf("width:%d\n", format.fmt.pix.width);
    printf("height:%d\n", format.fmt.pix.height);
    printf("pixelformat:%x\n", format.fmt.pix.pixelformat);
    printf("field:%x\n", format.fmt.pix.field);
    printf("bytesperline:%d\n", format.fmt.pix.bytesperline);
    printf("sizeimage:%d\n", format.fmt.pix.sizeimage);
    printf("colorspace:%d\n", format.fmt.pix.colorspace);
    format.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    format.fmt.pix.width = 640;
    format.fmt.pix.height = 480;
    format.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;

    ret = ::ioctl(fd, VIDIOC_S_FMT, &format);
    if(ret < 0){
        fprintf(stderr, "Not support jepg");
        perror("VIDIOC_S_FMT");
        exit(1);
    }
    reqbuf.count = 3;
    reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    reqbuf.memory = V4L2_MEMORY_MMAP;
    ret = ::ioctl(fd, VIDIOC_REQBUFS, &reqbuf);
    if(ret < 0){
        perror("VIDIOC_REQBUFS");
        exit(1);
    }

    bufinf = (struct bufinfor *)calloc(reqbuf.count, sizeof(struct bufinfor));
    if(!bufinf){
        perror("calloc");
        exit(1);
    }
    for(count = 0; count < reqbuf.count; count++){
        buf.index = count;
        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        buf.memory = V4L2_MEMORY_MMAP;
        ret = ::ioctl(fd, VIDIOC_QUERYBUF, &buf);
        if(ret < 0){
            perror("VIDIOC_REQBUFS");
            exit(1);
        }
        bufinf[buf.index].length = buf.length;
        bufinf[buf.index].start = mmap(NULL, buf.length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, buf.m.offset);
        if(!(bufinf[buf.index].start)){
            perror("mmap");
            exit(1);
        }
    }
    for(i = 0; i < reqbuf.count; i++){
        buf.index = i;
        buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
        buf.memory = V4L2_MEMORY_MMAP;
        ret = ::ioctl(fd, VIDIOC_QBUF, &buf);
        if(ret < 0){
            perror("VIDIOC_QBUF");
            exit(1);
        }
    }
    enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    ret = ::ioctl(fd, VIDIOC_STREAMON, &type);
    if(ret < 0){
        perror("VIDIOC_STREAMON");
        exit(1);
    }

    return 0;
}

还是通过ioctl映射出原始的图像数据,这里将图像的YUV数据转为bgr。在opencv中一般输入的是bgr图像进行处理。

    unsigned char *bgr=new unsigned char [640 * 480 *3];
    struct v4l2_buffer buf;

    fd_set readset;
    FD_ZERO(&readset);
    FD_SET(fd, &readset);
    ret = select(fd + 1, &readset, NULL, NULL, NULL);
    if(ret < 0){
        perror("select");
        exit(1);
    }

    buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
    buf.memory = V4L2_MEMORY_MMAP;
    ret = ioctl(fd, VIDIOC_DQBUF, &buf);
    if(ret < 0){
        perror("VIDIOC_DQBUF");
        exit(1);
    }

    convert_yuv_to_bgr_buffer((unsigned char *)bufinf[buf.index].start,bgr,640,480);
    ret = ioctl(fd, VIDIOC_QBUF, &buf);
    if(ret < 0){
        perror("VIDIOC_QBUF");
        exit(1);
    }
  1. 处理图像

将bgr数据导入Mat数据,注意opencv中使用的是行和列,即cols和rows,cols就是图像的宽度width,rows就是图像的高度height。所以这里是480, 640。下面就是opencv的常规操作了。

    Mat img = Mat(480, 640, CV_8UC3, bgr, 0);
    Mat dstImage, edge, grayImage;
    dstImage.create(img.size(), img.type() );
    cvtColor(img, grayImage, CV_BGR2GRAY);
    blur(grayImage, edge, Size(3,3) );
    Canny(edge, edge, 10, 30, 3 );
    cvtColor(edge, dstImage, CV_GRAY2BGR);
    addWeighted(img, 1, dstImage, 0.5, 1, img);

    putText(img, "QT+OPENCV", Point(120,100),FONT_HERSHEY_TRIPLEX,2,0,2,8);
  1. 显示图像

QT一般使用的是RGB图像,所以注意得转换一下,不然那颜色就反了。将Mat图像数据转为QImage即可。

    cvtColor(img, dstImage, CV_BGR2RGB);
    QImage *mage = new QImage(dstImage.data,640,480,QImage::Format_RGB888);
    QImage resultimg=mage->scaled(ui->label->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
    ui->label->setPixmap(QPixmap::fromImage(resultimg, Qt::AutoColor));

如此一个简易的QT+Opencv应用就完成了。工程附上,老铁们可以开始进阶了。

QT+Opencv的应用示例文章来源地址https://www.toymoban.com/news/detail-533663.html

到了这里,关于ARM应用之瑞芯微RK3568上使用QT+Opencv的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 瑞芯微rk3568移植openharmony3.1(鸿蒙)

    openharmony的移植推荐使用Ubuntu18.04,需要安装的依赖库文件。 获取openharmony官方源码。 下载完成后,可以改一下调试口的波特率,因为默认的是1500000,串口工具会有乱码,或者出现无法输入的问题,修改为115200。可以直接修改脚本文件。脚本文件有规则限制,只改一下波特率

    2024年02月11日
    浏览(28)
  • 史上最全! 瑞芯微RK3568核心板评估板资源分享!

    高性能处理器 :采用四核A55架构CPU,G52 GPU;内置NPU,可提供1T算力 高可靠性设计 :支持DDR及CPU Cache全链路ECC 内置自研ISP图像处理器 :8M@30fps处理能力,强大的HDR功能,支持畸变矫正、去雾、噪点消除等功能 丰富的显示、外设及拓展接口 :内置HDMI/eDP/LVDS/MIPI/RGB/T-CON显示接口

    2023年04月27日
    浏览(35)
  • 瑞芯微RK3568开发板保姆级护航入门学习嵌入式

    专为3568编写|迅为原创|拒绝网络拼凑 20+个手册2800+页手册进行结构分层适用于学习与开发 为了方便大家清晰快速的学习,迅为iTOP-3568开发板手册资料全面升级,对手册内容进行了结构分层,共计20+个文档,超2800+页的资料专为iTOP-3568开发板编写。适用于各种层面的学习者学习

    2024年02月14日
    浏览(22)
  • 瑞芯微RK3568/RK3588平台YOLOV5实时视频算法的部署小白教程

    本文实现整体的部署流程比较小白,首先在PC上分别实现工程中的模型仿真推理、yolov5-pytorch仿真推理、自己训练yolov5模型仿真推理,完成仿真之后再在板端分别实现rk提供模型的板端推理、yolov5-pytorch板端推理、自己训练的yolov5模型板端推理,最后实现自己训练的yolov5模型实

    2024年02月06日
    浏览(36)
  • 轻量级实时跟踪算法NanoTrack在瑞芯微RK3588上的部署以及使用

    文章目录 前言 一、模型转换 1.环境配置 2.模型解构 二、rk3588平台使用 1.模型初始化 2.推理 github: https://github.com/Try2ChangeX/NanoTrack_RK3588_python: python版本基于rk3588的NanoTrack,每秒可达120FPS 主要参考: SiamTrackers/NanoTrack at master · HonglinChu/SiamTrackers · GitHub GitHub - rockchip-linux/rknn-tool

    2024年02月13日
    浏览(45)
  • 瑞芯微RK3588,交叉编译opencv

    这里以opencv-4.6.0为例子。 下载: opencv-4.6.0 opencv_contrib-4.6.0 .cache 提取码:0816 eigen-3.3.9. ffmpeg-6.0 yasm-1.3.0 交叉编译器_gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz 注意:不要关闭当前终端!后面编译opencv也在当前终端。这里很重要! 安装libgtk2.0-dev时的报错,解决方案 以上,有

    2024年02月08日
    浏览(25)
  • OpenHarmony实战:瑞芯微RK3566移植案例(中)

    上篇文章:OpenHarmony实战:瑞芯微RK3566移植案例(上) 常见的INPUT设备有键盘、鼠标、游戏杆、Touch Screen等。Touch 设备与主机通讯采用标准 I2C 总线,触屏 IC 提供中断支持,提高了触屏数据的实时性。本项目的触摸屏器件IC 为 GT911。 驱动框架模型 INPUT驱动模型 INPUT 驱动模型核

    2024年04月23日
    浏览(23)
  • 迅为RK3588开发板-基于瑞芯微RK3588摄像头方案

    硬件: RK3588开发板+摄像头   MIPI摄像头:   1.1 硬件连接 RK3588 底板上有四个摄像头接口,如下图所示,此四个接口均可连接摄像头 ov5695 和 摄像头 ov13850。   摄像头模块连接硬件时要将模块对准插槽缺口处,J1 接口连接摄像头模块如下图所示:   J2 接口连接摄像头模块

    2024年02月09日
    浏览(32)
  • 瑞芯微RK3576 |牵头AIoT技术潮流,全新震撼来袭!

    深圳触觉智能科技有限公司 (industio.cn) 在快节奏的人工智能物联网(AIOT)领域,瑞芯微(Rockchip)全新推出的RK3576处理器横空出世。RK3576以其领先技术和卓越性能,为智能设备注入了无限的可能性,实现了更加智能和互动的体验。 下面让我们谈谈这款瑞芯微旗下最新的AIOT芯

    2024年04月11日
    浏览(26)
  • 瑞芯微RK3588 C++部署Yolov8检测和分割模型

    最近这一个月在研究国产瑞芯微板子上部署yolov8的检测和分割模型,踩了很多坑,记录一下部署的过程和遇到的一些问题: 需要的环境和代码主要包括: (1)rknn-toolkit2-1.5.2:工具链,开发环境 (2)rockchip-yolov8:pt模型转onnx模型 (3)yolov8_onnx2rknn:在(2)的基础上转检测

    2024年04月09日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包