0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【EASY EAI Nano开源套件试用体验】3摄像头与屏幕的使用

开发板试用精选 来源:开发板试用 作者:电子发烧友论坛 2022-10-11 16:44 次阅读

本文来源电子发烧友社区,作者:码农爱学习, 帖子地址:https://bbs.elecfans.com/jishu_2307434_1_1.html


EASY EAI Nano屏幕显示摄像头测试(附上体验视频,详见作者原贴)

本篇进行EASY EAI Nano的屏幕显示与摄像头显示测试,先来看下最终的测试效果:

  • 左图是显示图片
  • 右图是显示多个摄像头,包括:
    • 双面摄像头中左边的红外摄像头
    • 双面摄像头中右边的RGB摄像头
    • 外接USB摄像头

1.png

本篇测评参考了官方文档的一些内容:https://www.easy-eai.com/document_details/3/129

1 摄像头

1.1 MIPI CSI-2接口简介

MIPI CSI-2接口是由MIPI联盟下的Camera工作组指定的CSI(Camera Serial Interface)的第2版接口标准,主要由应用层、协议层、物理层组成,最大支持4个虚拟通道传输数据。

EASY EAI Nano的双面摄像头,包括一个RGB摄像头和一个红外摄像头,都是MIPI CSI-2接口。

通过指令检查EASY EAI nano的MIPI-CSI2接口模块是否正常工作

dmesg | grep mipi

2.png

1.2 三种类型的摄像头

1.2.1 RGB摄像头与IR摄像头

MIPI CSI-2的RGB摄像头在EASY EAI Nano套件下的位置定义如下所示,占用J3的bit1~18

MIPI CSI-2的红外摄像头在EASY EAI Nano套件下的位置定义如下所示,占用J3的bit22~37

3.png

1.2.2 USB摄像头

USB摄像头是基于UVC驱动工作的,

USB设备具有热插拔、易扩展等特性,故应用场合十分广泛。

Linux系统通过sysfs管理USB设备。

EASY EAI nano评估套件上集成了多路USB接口,其中有2路USB2.0 Host、1路USB2.0 Device。

1.3 摄像头操作的API介绍

EASY EAI nano已库文件+头文件的形式提供了摄像头的使用,摄像头的底层操作逻辑看不到,我们只需要关系头文件中API接口的使用方法即可。

选项 描述
头文件目录 -I easyeai-api/peripheral_api/camera
库文件目录 -L easyeai-api/ peripheral_api/camera
库连接参数 -lcamera

easyeai-api/peripheral_api/camera/camera.h中的主要接口

/* usb camera */
int usbcamera_init(int bus, int port, int width, int height, int rot);
void usbcamera_exit(int bus, int port);
int usbcamera_getframe(int bus, int port, char *pbuf);
void usbcamera_preset_fps(int fps);
​
/* rgb camera */
int rgbcamera_init(int width, int height, int rot);
void rgbcamera_exit(void);
int rgbcamera_getframe(char *pbuf);
void rgbcamera_set_format(int format);
​
/* ir camera */
int ircamera_init(int width, int height, int rot);
void ircamera_exit(void);
int ircamera_getframe(char *pbuf);
void ircamera_set_format(int format);

1.4 测试例程

三种摄像头的使用方式类似,RGB摄像头IR摄像头的使用方式几乎一样

RGB/IR摄像头的使用:

// 打开摄像头
#define CAMERA_WIDTH          720
#define CAMERA_HEIGHT         1280
ret = rgbcamera_init(CAMERA_WIDTH, CAMERA_HEIGHT,  90);
​
//获取图片
ret = rgbcamera_getframe(pbuf);
​
//保存图片
fp = fopen("/tmp/photo", "w");
fwrite(pbuf, 1, IMAGE_SIZE, fp);
fclose(fp);
​
//释放摄像头
rgbcamera_exit();

USB摄像头的使用:

// 打开摄像头
#define CAMERA_WIDTH          720
#define CAMERA_HEIGHT         1280
ret = usbcamera_init(USB2_0, USB_DIRECT, CAMERA_WIDTH, CAMERA_HEIGHT,  90);
​
//获取图片
ret = usbcamera_getframe(USB2_0, USB_DIRECT, pbuf);
​
//保存图片
fp = fopen("/tmp/photo", "w");
fwrite(pbuf, 1, IMAGE_SIZE, fp);
fclose(fp);
​
//释放USB摄像头
usbcamera_exit(USB2_0, USB_DIRECT);

以上测试函数,会用摄像头拍一张照片,并保存到/tmp目录中。

2 显示屏

2.1 DRM驱动框架介绍

EASY EAI nano评估板上默认支持5寸显示屏(带电容触摸屏),分辨率为720x1280,EASY EAI nano产品使用DRM(Direct Rendering Manager)驱动框架实现多应用同时使用同一个显示器的目的,而EASY-EAI-Toolkit的display库则是对DRM的封装。

4.png

2.2 显示屏操作的API介绍

头文件与库文件

选项 描述
头文件目录 -I easyeai-api/peripheral_api/display
库文件目录 -L easyeai-api/ peripheral_api/display
库链接参数 -ldisplay

easyeai-api/peripheral_api/display/disp.h中的主要接口

/* 公共api */
void disp_preset_uiLayer(int enable);
​
/* 适合初次使用 */
int disp_init(int width, int height); //默认输入RGB888
void disp_exit(void);
void disp_commit(void *ptr, int data_len);
​
/* pro, 显示多路视频时,或旋转输入图像角度,或裁切图像*/
int disp_init_pro(disp_screen_t *screen);
void disp_exit_pro(void);
void disp_commit_pro(void *ptr, int chn, int data_len);

一些参数的含义:

  • width:显示区域宽度
  • height:显示区域高度
  • ptr:用户空间的显示内容空间
  • data_len:输入图像数据内存长度
  • screen:显示屏属性,包含显示区域大小、子窗口的描述等
  • chn:目标窗口索引

结构体定义

typedef struct disp_win {
int enable;
int win_x;
int win_y;
int win_w;
int win_h;
int rotation;//顺时针旋转输入图像角度,支持90、180、270、0度
IMAGE_TYPE_E in_fmt;
int in_w;//输入图像宽度
int in_h;//输入图像高度
int HorStride;//输入图像水平步长
int VirStride;//输入图像垂直步长
/* 如果不设置crop系列参数,则默认拉伸原图铺满整个win ;
 *设置crop则先裁切再把裁切后的图像铺满整个win,以便保持图像宽高比例
 */
int crop_x;//裁切起始X坐标(基于旋转前图像的坐标系)
int crop_y;//裁切起始Y坐标(基于旋转前图像的坐标系)
int crop_w;//裁切后的图像宽度(以旋转前的图像为参考)
int crop_h;//裁切后的图像高度(以旋转前的图像为参考)
} disp_win_t;
​
typedef struct disp_screen {
    int screen_width;
int screen_height;
disp_win_t wins[VMIX_MAX_CHN_NUM];
} disp_screen_t;

2.3 测试例程

参考官方给的例程,进行修改,增加通过参数显示指定图片的功能,测试不同图片显示到屏幕的效果。

my-display.c的主程序如下:

int main(int argc, char *argv[])
{
    char *img_path = IMAGE_PATH;
    if (argc == 2)
    {
        img_path = argv[1];
        printf("recv:%sn", img_path);
    }
        
int ret = 0;
    char *pbuf = NULL;
FILE *fp = NULL;
disp_screen_t screen = {0};
​
signal(SIGINT, sigterm_handler);
​
/* 1、准备图像数据 */
pbuf = (char *)malloc(IMAGE_SIZE);
    if (!pbuf) {
        printf("malloc error: %s, %dn", __func__, __LINE__);
        return -1;
    }
fp = fopen(img_path, "r");
if (!fp) {
printf("fopen error: %s, %dn", __func__, __LINE__);
return -1;
}
    ret = fread(pbuf, 1, IMAGE_SIZE, fp);
fclose(fp);
if (ret != IMAGE_SIZE) {
printf("fread error: %s, %dn", __func__, __LINE__);
free(pbuf);
return -1;
}
​
/* 2、初始化显示 */
screen.screen_width = DISP_WIDTH;
screen.screen_height = DISP_HEIGHT;
screen.wins[0].enable = 1;
    screen.wins[0].win_x = 0;
screen.wins[0].win_y = 0;
screen.wins[0].win_w = 720;
screen.wins[0].win_h = 1280;
    screen.wins[0].rotation = 0;
screen.wins[0].in_fmt = IMAGE_TYPE_RGB888;
screen.wins[0].in_w = DISP_WIDTH;
screen.wins[0].in_h = DISP_HEIGHT;
screen.wins[0].HorStride = DISP_WIDTH;
screen.wins[0].VirStride = DISP_HEIGHT;
​
ret = disp_init_pro(&screen);
if (ret) {
printf("error func:%s, line:%dn", __func__, __LINE__);
goto exit1;
}
​
/* 3、提交显示 */
g_run = 1;
disp_commit_pro(pbuf, 0, IMAGE_SIZE);
    
while(g_run) {
sleep(1);
}
​
disp_exit_pro();
exit1:
free(pbuf);
pbuf = NULL;
    
    return ret;
}

修改CMakeLists.txt,增加如下内容:

#--------------------------
# my-display
#--------------------------
link_directories(${toolkit_root}/peripheral_api/display)#-L
add_executable(my-display my-display.c)#-o
target_link_libraries(my-display pthread easymedia display)#-l
target_include_directories(my-display PRIVATE ${api_inc})#-I

在执行函数时,附加一个图片的路径参数,可以显示指定的图片:

5.png

准备一些测试图片,格式为RGB888,分辨率720x1280,测试显示两张不同图片的效果:

6.png

3 摄像头+屏幕程序代码分析

参考官方的摄像头显示例程,将红外摄像头、RGB摄像头和USB摄像头采集的画面同时显示到屏幕中,改写的测试代码如下。

my-disp-cam.c的主程序如下:

int main()
{
	char *prgb = NULL;
	char *pir = NULL;
    char *pusb = NULL;
	int ret = 0;
	disp_screen_t screen = {0};
    
    bool bHasUSBCamear = false;

	signal(SIGINT, sigterm_handler);

	/* camera init */
	ret = rgbcamera_init(CAMERA_WIDTH, CAMERA_HEIGHT, 90);
	if (ret) {
		printf("error func:%s, line:%dn", __func__, __LINE__);
		goto exit_donothing;
	}
	ret = ircamera_init(CAMERA_WIDTH, CAMERA_HEIGHT, 270); //此角度由摄像头模组决定
	if (ret) {
		printf("error func:%s, line:%dn", __func__, __LINE__);
		goto exit_freergb;
	}
    ret = usbcamera_init(USB2_0, USB_DIRECT, CAMERA_WIDTH, CAMERA_HEIGHT, 180);
	if (ret) {
		printf("error func:%s, line:%dn", __func__, __LINE__);
	}
    else
    {
        bHasUSBCamear = true;
    }

	/* display init */
	screen.screen_width = DISP_WIDTH;
	screen.screen_height = DISP_HEIGHT;
    
	screen.wins[0].enable = 1;
	screen.wins[0].in_fmt = IMAGE_TYPE_RGB888;
	screen.wins[0].in_w = CAMERA_WIDTH;
	screen.wins[0].in_h = CAMERA_HEIGHT;
	screen.wins[0].rotation = 0;
	screen.wins[0].win_x = 0;
	screen.wins[0].win_y = 0;
	screen.wins[0].win_w = 360;
	screen.wins[0].win_h = 640;
    
	screen.wins[1].enable = 1;
	screen.wins[1].in_fmt = IMAGE_TYPE_RGB888;
	screen.wins[1].in_w = CAMERA_WIDTH;
	screen.wins[1].in_h = CAMERA_HEIGHT;
	screen.wins[1].rotation = 0;
	screen.wins[1].win_x = 360;
	screen.wins[1].win_y = 0;
	screen.wins[1].win_w = 360;
	screen.wins[1].win_h = 640;
    
    if (bHasUSBCamear)
    {
        screen.wins[2].enable = 1;
        screen.wins[2].in_fmt = IMAGE_TYPE_RGB888;
        screen.wins[2].in_w = CAMERA_WIDTH;
        screen.wins[2].in_h = CAMERA_HEIGHT;
        screen.wins[2].rotation = 0;
        screen.wins[2].win_x = 0;
        screen.wins[2].win_y = 640;
        screen.wins[2].win_w = 720;
        screen.wins[2].win_h = 640;
    }
    
	ret = disp_init_pro(&screen);
	if (ret) {
		printf("error func:%s, line:%dn", __func__, __LINE__);
		goto exit_freergb_freeir;
	}

	/* alloc buffer for cap data */
	prgb = (char *)malloc(IMAGE_SIZE);
	if (!prgb) {
		printf("error: %s, %dn", __func__, __LINE__);
		ret = -1;
		goto exit_freergb_freeir_freedisp;
	}
	pir = (char *)malloc(IMAGE_SIZE);
	if (!pir) {
		printf("error: %s, %dn", __func__, __LINE__);
		ret = -1;
		goto exit_freergb_freeir_freedisp_freeprgb;
	}
    if (bHasUSBCamear)
    {
        pusb = (char *)malloc(IMAGE_SIZE);
            if (!pusb) {
            printf("error: %s, %dn", __func__, __LINE__);
        }
    }

	g_run = 1;
	while(g_run) {
        ret = ircamera_getframe(pir);
		if (!ret) {
			disp_commit_pro(pir, 0, IMAGE_SIZE);
		}
		ret = rgbcamera_getframe(prgb);
		if (!ret) {
			disp_commit_pro(prgb, 1, IMAGE_SIZE);
		}
        if (bHasUSBCamear)
        {
            ret = usbcamera_getframe(USB2_0, USB_DIRECT, pusb);
            if (!ret) {
                disp_commit_pro(pusb, 2, IMAGE_SIZE);
            }
        }
	}
    
    if (bHasUSBCamear)
    {
        free(pusb);
        pusb = NULL;
        usbcamera_exit(USB2_0, USB_DIRECT);
    }

	free(pir);
	pir = NULL;
exit_freergb_freeir_freedisp_freeprgb:
	free(prgb);
	prgb = NULL;
exit_freergb_freeir_freedisp:
	disp_exit_pro();
exit_freergb_freeir:
	ircamera_exit();
exit_freergb:
	rgbcamera_exit();
exit_donothing:
    return ret;
}

修改CMakeLists.txt,增加如下内容:

#--------------------------
# my-disp-cam
#--------------------------
link_directories(${toolkit_root}/peripheral_api/display)	#-L
link_directories(${toolkit_root}/peripheral_api/camera)		#-L
add_executable(my-disp-cam my-disp-cam.c)		#-o
target_link_libraries(my-disp-cam pthread rkaiq rkfacial rga easymedia display camera)	#-l
target_include_directories(my-disp-cam PRIVATE ${api_inc})	#-I

测试效果如下图左图,3个摄像头可以同时显示到屏幕,实测当摄像头运动时,屏幕显示的画面也十分流畅。

另外,还可以修改摄像头和屏幕的显示方向,如下图右图,就是将USB摄像头横屏显示的效果。

7.png

4 总结

本篇对EASY EAI Nano的屏幕和摄像头的显示功能进行测评,测试了屏幕显示不同的图片,屏幕显示不同的摄像头(MIPI红外摄像头、MIPI RGB摄像头、外接USB摄像头),以及多个摄像头的同时显示与屏幕显示方向的测试。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开发板
    +关注

    关注

    25

    文章

    4511

    浏览量

    94470
  • 灵眸
    +关注

    关注

    0

    文章

    19

    浏览量

    3134
收藏 人收藏

    评论

    相关推荐

    【LicheeRV-Nano开发套件试用体验】+智能平板开发

    开发 6.摄像头开发 7.AI人脸识别、运动侦测、姿态检测调试开发 预期成果 1.熟练算能软件工具使用,代码编写调试 2.外设功能驱动达成相应效果 3.网络、音频调通 4.界面设计的显示和操作
    发表于 03-06 23:05

    EASY EAI Nano】RV1126实时读取摄像头并进行yolo检测显示

    实现了三个并行模块,分别是 摄像头读取,使用opencv转换到适合大小 yolo检测 托管到Qt进行现实 检测的DEMO从每帧10次改到每帧2次,可以看到还是具备一定实时性。 代码:仓库
    发表于 01-14 18:53

    【KV260视觉入门套件试用体验】KV260 开发套件使用体验(二、接通摄像头

    【KV260视觉入门套件试用体验】KV260 开发套件使用体验(二、接通摄像头) 1、KV260 摄像头硬件接口 KV260 可以接多个
    发表于 09-03 11:41

    EASY EAI Nano人工智能开发套件试用体验】摄像头驱动程序-carmera库、display库使用-opencv和v4l2测试

    rkaiq; easymedia 应该是 easy eai 适配的摄像头驱动库; rga rkaiq 是瑞芯微 isp 类的驱动库 libcamera.a 这些就是 easy
    发表于 06-25 22:43

    EASY EAI Nano人工智能开发套件试用体验】GPIO点灯——使用sysfs接口

    先介绍一些背景知识,然后在shell中交互式演示,最后通过编写C语言程序读写sysfs进行GPIO控制。 一、硬件部分 本篇的硬件包含EASY EAI Nano开发板和三色LED灯,EASY
    发表于 06-23 20:01

    EASY EAI Nano人工智能开发套件试用体验】EASY EAI Nano人工智能开发套件连接屏幕摄像头及跑分评测

    评测EASY EAI Nano人工智能开发套件连接屏幕摄像头,并做个 编译ncnn跑分,首先将
    发表于 06-11 23:07

    EASY EAI Nano人工智能开发套件试用体验】EASY EAI Nano人工智能开发套件开箱及最快上手教程

    EASY EAI Nano人工智能开发套件简介 EASY EAI
    发表于 06-11 13:34

    EASY EAI Nano人工智能开发套件试用体验】硬件解读——从套件到芯片

    套件包含: EASY EAI Nano主板 5寸IPS触摸屏,分辨率 720x1280 双目摄像头,200万像素 电源,12V,1A
    发表于 06-10 12:26

    EASY EAI Nano人工智能开发套件试用体验】EASY EAI Nano人工智能开发套件开发环境的准备和架设

    大家好,今天来分享我在EASY EAI Nano人工智能开发套件中环境准备和架设的过程,希望对其他开发者起到避坑、缩短开发时间。 还是先简单介绍一下
    发表于 06-10 10:32

    EASY EAI Nano人工智能开发套件试用体验】开箱视频及核心板介绍

    今天收到了EASY EAI Nano人工智能开发套件,趁着热乎给大家做个开箱视频,希望各位看官对EASY
    发表于 05-31 19:45

    EASY EAI Nano人工智能开发套件试用体验】开箱后硬件了解及上电

    总的来说开箱后整个EASY EAI Nano人工智能开发套件还是做工精细,板子设计合理,打开包装盒给人的第一感觉是精美,高大上的一种感觉。 E
    发表于 05-31 19:35

    EASY EAI Nano人工智能开发套件试用体验】EASY EAI Nano人工智能开发套件开箱及硬件初体验

    海绵镂空包装,各个配件紧紧的镶在泡沫塑料里,很好的保护了开发板套件。 右上角是EASY EAI Nano人工智能开发套件电源,12V 1A的
    发表于 05-31 19:18

    EASY EAI Nano人工智能开发套件试用体验】开箱

    开箱 套件主要包含三大件:主板、显示屏、双目摄像头: 官方套件指示 主板 有NanoNano-T(类似树莓派cm4对插件)两种
    发表于 05-30 22:12

    灵眸科技 EASY EAI Nano 开发板产品数据手册

    EASY EAI Nano 是基于 RV1126 处理器设计,外设资源丰富,接口齐全。集成有百兆以太网、Wi-Fi 等通信外设。摄像头、显示屏(带电容触摸)、喇叭、麦克风等交互外设。2
    发表于 05-29 14:24

    EASY EAI Nano人工智能开发套件试用体验】EASY EAI Nano人工智能开发套件开箱与初体验

    为啥,好像瑞芯微平台不用这个节点?不太懂,有没有懂的大佬指导一下,谢谢 网络的话,还有一个CAN,不错,不知道软件上好调试不,不过对于我的项目CAN没啥用 摄像头节点,双目摄像头,没问题 在系统
    发表于 05-29 13:39