基于imx6ull平台opencv的图像采集和显示屏LCD显示功能(不带Qt界面)

目录

  • 一、概述
  • 二、环境要求
    • 2.1 硬件环境
    • 2.2 软件环境
  • 三、开发流程
    • 3.1 编写测试
    • 3.2 验证功能

一、概述

本文档是针对imx6ull平台opencv的图像采集和显示屏LCD显示功能,opencv通过摄像头采集视频图像,将采集的视频图像送给显示屏LCD进行显示。

  • 测试结果如下图所示:

在这里插入图片描述

二、环境要求

2.1 硬件环境

  • 硬件:正点原子-I.MX6U ALPHA开发板
  • 摄像头:正点原子-OV5640单目摄像头
  • 显示屏:正点原子-4.3寸-800x480显示屏
  • 虚拟机:VMware

2.2 软件环境

  • Ubuntu系统要求:20.04
  • opencv版本: 4.7.0
  • 交叉工具链版本:交叉工具链版本:gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf
  • 开发语言: C++

注意: 其中,需要有OV5640单目摄像头和4.3寸-800x480显示屏的驱动。

三、开发流程

关于imx6ull平台下opencv的移植及交叉编译器环境请参看:基于imx6ull开发板 移植opencv4.7.0

3.1 编写测试

选择一个目录,我这里选择的是opencv_lcd_imx6ull,创建一个opencv_lcd.cpp文件,内容如下:

#include <opencv2/opencv.hpp>
#include <opencv2/videoio/videoio.hpp>
#include <opencv2/core/utils/logger.hpp>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>/**** 静态全局变量 ****/
static int width;                       //LCD X分辨率
static int height;                      //LCD Y分辨率
static unsigned short *screen_base = NULL;        //映射后的显存基地址
static unsigned long line_length;       //LCD一行的长度(字节为单位)using namespace std;
using namespace cv;int main() {struct fb_fix_screeninfo fb_fix;struct fb_var_screeninfo fb_var;unsigned int screen_size;// 打开LCD设备int fb = open("/dev/fb0", O_RDWR);if (fb < 0) {perror("open fb0 failed");return -1;}/* 获取参数信息 */// 获取LCD屏幕信息if (ioctl(fb, FBIOGET_VSCREENINFO, &fb_var) < 0) {perror("ioctl FBIOGET_VSCREENINFO failed");return -1;}// 获取LCD帧缓冲区信息if (ioctl(fb, FBIOGET_FSCREENINFO, &fb_fix) < 0) {perror("ioctl FBIOGET_FSCREENINFO failed");return -1;}// 初始化OpenCVcv::utils::logging::setLogLevel(cv::utils::logging::LOG_LEVEL_SILENT);//括号内数字为1是调用usb摄像头,为0则是调用电脑自带摄像头cv::VideoCapture capture(1);unsigned short *screen_ptr = screen_base;// 设置摄像头的分辨率cv::Size resolution(800, 480);capture.set(cv::CAP_PROP_FRAME_WIDTH, resolution.width);capture.set(cv::CAP_PROP_FRAME_HEIGHT, resolution.height);// 加载预先训练好的人脸识别模型cv::CascadeClassifier faceCascade;faceCascade.load("haarcascade_frontalface_default.xml");// 将图像数据写入LCD屏幕screen_size = fb_fix.line_length * fb_var.yres;line_length = fb_fix.line_length;width = fb_var.xres;height = fb_var.yres;screen_base = mmap(NULL, screen_size, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0);if (MAP_FAILED == (void *)screen_base) {perror("mmap failed");return -1;}memset(screen_base, 0xFF, screen_size);unsigned short *fb_line_buf = NULL; //行缓冲区:用于存储写入到LCD显存的一行数据cv::Mat image;  //定义一个Mat变量,用于存储每一帧的图像capture >> image;  //读取当前帧printf("%d %d %d\r\n", image.cols, image.rows, image.channels());fb_line_buf = malloc(image.cols * 2);//【2】循环显示每一帧while(1)  {  // cv::Mat image;  //定义一个Mat变量,用于存储每一帧的图像capture >> image;  //读取当前帧// printf("%d %d %d\r\n", image.cols, image.rows, image.channels());screen_ptr = screen_base;if (image.empty()) continue; // 如果没有读取到帧,退出循环for (size_t y = 0; y < image.rows; y++){char* row_ptr = image.ptr<char>(y);for (size_t x = 0; x < image.cols; ++x) {//这是获得像素数据数组的头指针,注意像素数据可能会有多个通道所以才需要用数组存储char* data_ptr = &row_ptr[x * image.channels()];// //对当前像素逐个通道输出颜色值// for (int i = 0; i < image.channels(); ++i) {//     cout << int(data_ptr[i])<<endl;// }// BGR888转为RGB565fb_line_buf[x] = ((data_ptr[2] & 0xF8) << 8) |((data_ptr[1] & 0xFC) << 3) |((data_ptr[0] & 0xF8) >> 3);}memcpy(screen_ptr, fb_line_buf, image.cols * 2);//将一行数据刷入显存screen_ptr += width;   //定位到显存下一行}}  // 解除内存映射munmap(screen_base, screen_size);// 关闭LCD设备close(fb);return 0;
}

opencv_lcd_imx6ull目录下,创建一个build_arm.sh文件,内容如下:

/tools/ToolsChain/nxp/imx6ull/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++ opencv_lcd.cpp -o opencv_lcd \
-I /data/Workspace_Linux/software_lib/opencv-x.x.x/output/opencv-4.7.0/imx6ull/include/opencv4 \
-L /data/Workspace_Linux/software_lib/opencv-x.x.x/output/opencv-4.7.0/imx6ull/lib \
-lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_videoio -lopencv_imgcodecs -lopencv_face -lopencv_dnn  -lopencv_features2d -lopencv_flann -lopencv_calib3d -lopencv_objdetect \
-fpermissive

注意:

  • 交叉工具链:/tools/ToolsChain/nxp/imx6ull/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++;
  • opencv头文件路径:/data/Workspace_Linux/software_lib/opencv-x.x.x/output/opencv-4.7.0/imx6ull/include/opencv4,开发者根据自己的路径进行配置;
  • opencv库路径:/data/Workspace_Linux/software_lib/opencv-x.x.x/output/opencv-4.7.0/imx6ull/lib,开发者根据自己的路径进行配置。

3.2 验证功能

  • 源码编译并上传
    opencv_lcd_imx6ull目录下,将build_arm.sh文件更改成可执行文件,并运行如下图所示:
./build_arm.sh

在这里插入图片描述
进入imx6ull开发板的/mnt/test_opencv目录下(若没有改目录则创建该目录),创建opencv_lcd目录,如下图所示:
在这里插入图片描述

opencv_lcd文件通过tfp上传到imx6ull开发板的/mnt/test_opencv/opencv_lcd目录下,如下图所示:
在这里插入图片描述
在这里插入图片描述

  • opencv库上传到imx6ull开发板
    进入/data/Workspace_Linux/software_lib/opencv-x.x.x/output/opencv-4.7.0/imx6ull目录下,将opencv库相关的内容进行打包,如下图所示:
    在这里插入图片描述
    进入imx6ull开发板的/mnt/test_opencv目录下(若没有改目录则创建该目录),创建opencv目录,如下图所示:
    在这里插入图片描述
    opencv.tar文件通过tfp上传到imx6ull开发板的/mnt/test_opencv/opencv目录下,如下图所示:
    在这里插入图片描述
    进入imx6ull开发板的/mnt/test_opencv/opencv目录下,执行以下命令,将opencv.tar文件进行解压,如下图所示:
tar -xf opencv.tar

在这里插入图片描述

  • opencv库配置环境搭建

执行以下命令进行opencv库环境配置,如下图所示:

export LD_LIBRARY_PATH=/mnt/test_opencv/opencv/lib:$LD_LIBRARY_PATH

在这里插入图片描述

  • 运行应用程序

进入imx6ull开发板的/mnt/test_opencv/opencv_lcd目录下,更改opencv_lcd为可执行文件,并运行,运行结果如下:
在这里插入图片描述
在这里插入图片描述
最后,基于imx6ull平台opencv的图像采集和显示屏LCD显示功能验证完成了。

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

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

相关文章

【数据结构3】哈希表、哈希表的应用(集合与字典、md5算法和文件的哈希值)

1 哈希表 哈希表一个通过哈希函数来计算数据存 储位置的数据结构&#xff0c;通常支持如下操作: 插入(键&#xff0c;值):插入键值对(键&#xff0c;值) Get(key):如果存在键为键的键值对则返回其值&#xff0c;否则返回空值 删除(键):删除键为键的键值对哈希表(Hash Table&am…

使用kafka改造分布式事务

文章目录 1、kafka确保消息不丢失&#xff1f;1.1、生产者端确保消息不丢失1.2、kafka服务端确保消息不丢失1.3、消费者确保正确无误的消费 2、生产者发送消息 KafkaService3、UserInfoServiceImpl -> login()4、service-account - > AccountListener.java 1、kafka确保消…

Renesa Version Board开发RT-Thread 之UART驱动应用

目录 概述 1 硬件介绍 2 软件配置 2.1 RT-Thread Studio配置参数 2.2 FSP配置MCU 3 RT-Thread中UART的接口介绍 3.1 RT-Thread UART简介 3.2 RT-Thread 下的UART接口 4 UART的应用 4.1 应用功能实现 4.2 源代码文件 5 测试 程序下载地址&#xff1a; RenesaVersio…

应用层协议(上)Http(URL、Cookie、Session)内含逻辑图解通俗易懂!

绪论​ “少年没有乌托邦 心向远方自明朗”&#xff0c;本章是应用层常用且重要的协议htttp&#xff0c;没看过应用层建议一定先看那一篇后再看本章才能更好的去从上到下的理解应用层。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xff09;。 1.Http协…

Linux rocky 9.2 安装mysql-8.0.39-linux-glibc2.28-x86_64.tar.xz

数据库官方下载&#xff1a;MySQL :: Download MySQL Community Server 本文也绑定该资源包&#xff0c;免费提供下载学习。 1.系统版本 2.新建目录&#xff0c;存放数据库安装包&#xff0c;并且上传 需要用到的工具&#xff1a;yum -y install vim lrzsz tar 上传解压&…

探索Python交互式编程的新境界:Python-prompt-toolkit的魔法

文章目录 探索Python交互式编程的新境界&#xff1a;Python-prompt-toolkit的魔法背景&#xff1a;为何选择Python-prompt-toolkit&#xff1f;Python-prompt-toolkit是什么&#xff1f;如何安装Python-prompt-toolkit&#xff1f;简单使用&#xff1a;Python-prompt-toolkit的…

C++,std::queue 详解

文章目录 1. 概述2. 包含头文件3. 基本操作3.1 构造函数3.2 赋值操作3.3 成员函数 4. 迭代器5. 示例6. 注意事项参考 1. 概述 std::queue 是 C 标准模板库&#xff08;STL&#xff09;中的一个容器适配器&#xff0c;它提供了一种先进先出&#xff08;FIFO&#xff09;的数据结…

【研发日记】嵌入式处理器技能解锁(五)——TI C2000 DSP的中断系统

文章目录 前言 背景介绍 中断框架 外设中断 ePIE模块 CPU中断 中断嵌套 应用实例 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解锁(二)——TI C2000 DSP的SCI(串口)通信》 见…

基于Java的小区物业管理系统APP的设计与实现(论文+源码)_kaic

摘 要 小区物业管理系统是现代社会中非常热门的软件&#xff0c;伴随着社区规模的不断扩大和住户的不断增多&#xff0c;本系统的主要目的是辞别帐本以及传统的单一数据管理系统&#xff0c;快捷的保存用户各种数据信息。本系统针对Java系统展开&#xff0c;使用Java、SpringB…

无人机RTK定位定向技术详解

无人机RTK&#xff08;Real-Time Kinematic&#xff0c;实时动态差分技术&#xff09;定位定向技术&#xff0c;是无人机领域的一项高精度导航与定位技术。它结合了全球导航卫星系统&#xff08;如GPS、GLONASS、Galileo、BDS等&#xff09;与实时差分技术&#xff0c;通过地面…

超越GPT4V,最强多模态MiniCPM-V2.6模型分享

MiniCPM-V2.6是由OpenBMB开发的一款多模态大型语言模型&#xff08;MLLM&#xff09;&#xff0c;专为视觉-语言理解设计。 MiniCPM-V2.6模型能够处理图像、视频和文本输入&#xff0c;并提供高质量的文本输出。 MiniCPM-V 2.6模型在单图像理解方面超越了广泛使用的专有模型&…

机器学习课程学习周报九

机器学习课程学习周报九 文章目录 机器学习课程学习周报九摘要Abstract一、机器学习部分1.1 Word Embedding1.1.1 词嵌入的基本概念1.1.2 word2vec连续词袋模型CBOW1.1.3 word2vec跳字模型Skip-gram 1.2 Transformer代码实践DatasetDataloaderModelLearning rate scheduleModel…

windows javascript 打开、关闭摄像头

1. 效果 打开摄像头 关闭摄像头&#xff08;包括指示灯也关了的&#xff09; 2. 代码 open_close_camera.html // open_close_camera.html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>use camera</title>…

使用Dotween制作按钮弹性动画效果

效果&#xff1a; 方式&#xff1a; 优点&#xff0c;不需要写任何代码、稳定、可自定义效果

Agent实际落地的应用 未来生活的无形助手

在这个信息爆炸的时代&#xff0c;我们每个人都在追求更高效的生活方式。想象一下&#xff0c;如果有一个无形的助手&#xff0c;能够理解我们的需求&#xff0c;自动处理繁琐的任务&#xff0c;甚至为我们提供个性化的建议&#xff0c;那将是多么美好的体验&#xff01;这正是…

数字模拟IC设计前端、后端、前仿、后仿新版虚拟机

虚拟化平台&#xff1a;VMware Workstation 15 Pro以上版本 操作系统&#xff1a;CentOS Linux release 7.9.2009 (Core) 一、射频模拟IC设计必备软件 Cadence IC06.18.350/IC23.10.080&#xff08;virtuoso&#xff09; Cadence SPECTRE23.10.538-isr10 Cadence ASSURA04.…

Spring Boot OAuth2.0应用

本文展示Spring Boot中&#xff0c;新版本OAuth2.0的简单实现&#xff0c;版本信息&#xff1a; spring-boot 2.7.10 spring-security-oauth2-authorization-server 0.4.0 spring-security-oauth2-client 5.7.7 spring-boot-starter-oauth2-resource-server 2.7.10展示三个服务…

远程供水无障碍,管线车助力全面消防防护_鼎跃安全

夏季是各类自然灾害的高发季节&#xff0c;其中森林火灾尤为频繁。这一时期的气候特征是干旱少雨&#xff0c;伴随着高温和强风&#xff0c;使得森林火灾的发生频率大幅增加。由于夏季空气湿度低&#xff0c;植被含水量减少&#xff0c;一旦出现火源&#xff0c;火势极易蔓延。…

数据结构-链表-第二天

结合leetcode学习c 链表比数组更易增加和删除数据&#xff0c;但访问速度更慢 定义 链表&#xff08;linked list&#xff09;是一种线性数据结构&#xff0c;其中的每个元素都是一个节点对象&#xff0c;各个节点通过“引用”相连接。 引用记录了下一个节点的内存地址&#…

windows本地搭建zookeeper和kafka环境

zookeeper 1.1 下载zookeeper 下载地址 随便进一个站点&#xff0c;默认是新版本&#xff0c;旧版本点击archives进入&#xff0c;选择合适的版本下载&#xff0c;本文使用的是3.7.2 下载时候选择apache-zookeeper-3.7.2-bin.tar.gz 格式的&#xff0c;编译后的&#xff0c;解…