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

本文介绍了如何在基于RK3568的开发板上结合QT和OpenCV进行图像处理。首先配置QT项目以包含OpenCV库,然后通过ioctl函数设置USB摄像头参数,获取640x480分辨率的YUV图像并转换为BGR,再利用OpenCV进行图像处理,包括灰度化、模糊、边缘检测等操作。最后,将处理后的图像转换为QImage并在QT界面显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

手上有一块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的应用示例

RK3568是一款基于RISC-V架构的嵌入式处理器,常用于开发物联网(IoT)设备和工业应用。它结合Qt5(一款跨平台的图形用户界面应用程序框架)和OpenCV(开源计算机视觉库),可以实现以下功能: 1. **GUI开发**[^4] - Qt5允许你在RK3568上构建交互式的图形用户界面,支持实时显示摄像头视频流或处理图像数据。 ```python # 使用Qt和PySide2 (Qt的Python绑定) from PySide2.QtWidgets import QApplication, QLabel from cv2 import.VideoCapture app = QApplication([]) label = QLabel() cap = cv2.VideoCapture(0) # 假设连接的是默认摄像头 while True: ret, frame = cap.read() if not ret: break pixmap = QPixmap.fromImage(QImage(frame)) label.setPixmap(pixmap) label.show() app.exec_() ``` 2. **计算机视觉处理**[^5] - OpenCV可以在RK3568上运行机器视觉算法,如物体检测、人脸识别、图像分割等。这有助于实时分析视频数据。 ```python import cv2 import numpy as np # 在循环中读取帧并执行人脸检测 face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml') frame = cap.read() faces = face_cascade.detectMultiScale(frame, scaleFactor=1.1, minNeighbors=5) for (x, y, w, h) in faces: cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) cv2.imshow('Video', frame) cv2.waitKey(1) ``` 要开始开发,确保已安装必要的库(如PySide2、OpenCV等),并了解RK3568的SDK和驱动程序如何与这些工具集成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值