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

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

3天内不再提示

【AWTK使用经验】如何播放视频或摄像头画面

ZLG致远电子 2024-07-04 08:25 次阅读

AWTK是基于C语言开发的跨平台GUI框架。《AWTK使用经验》系列文章将介绍开发AWTK过程中一些常见问题与解决方案,例如:如何加载外部资源?如何设计自定义进度条?这些都会在系列文章进行解答。

假设目前想在ZTP800示教器的AWTK程序中实现播放视频或者播放摄像头画面的效果,可以借助AWTK的mutable_image控件或usb_camera控件来显示画面。下图则是ZTP800示教器使用usb_camera控件Demo显示摄像头画面的效果图:
e78bbb6a-399b-11ef-a655-92fbcf53809c.png图1ZTP800示教器显示摄像头画面效果图

usb_camera控件和mutable_image控件的对比

关于文章开头提到的两个控件对比如下:

1. mutable_image控件

mutable_image控件可以显示视频画面,也可以显示摄像头等外接设备画面。适用性比较广泛,但使用起来相对繁琐一些。它本身是不负责解析视频或摄像头设备画面数据的,用户可以通过第三方库解析并获取画面原始RGB数据,将数据拷贝到mutable_image控件特定回调函数里面即可显示画面。

2. usb_camera控件

usb_camera控件本质上是对mutable_image控件的封装,专门用于显示摄像头画面。在控件内部实现了获取并解析摄像头画面数据的代码,用户只需调用特定的API即可显示摄像头画面,而不用手动拷贝原始RGB数据。与mutable_image相比没那么广,但是使用起来相对方便。

使用usb_camera控件显示摄像头画面

使用usb_camera控件显示摄像头画面的流程比较简单:在AWStudio插件列表可以安装该插件,之后在自己的AWTK应用放置一个usb_camera控件和一个按钮控件,设置usb_camera控件的摄像头设备、大小等属性,并且给该按钮注册点击事件用于打开摄像头。e7b0fbfa-399b-11ef-a655-92fbcf53809c.png图2使用usb_camera控件页面布局示例

按钮点击事件回调函数可以参考以下代码示例:

static ret_t on_button_click(void* ctx, event_t* e) { ret_t ret = RET_OK; widget_t* win = WIDGET(ctx); widget_t* camera = widget_lookup(win, "usb_camera", TRUE);
if(usb_camera_is_open(camera) && usb_camera_is_play(camera)) { usb_camera_stop(camera); usb_camera_close(camera); } else { ret = usb_camera_open(camera); if (ret != RET_OK) { dialog_toast("open camera fail", 3000); return ret; } return usb_camera_play(camera); } return RET_OK;}


使用mutable_image控件显示视频或摄像头画面

mutable_image控件主要提供了 mutable_image_set_prepare_image 函数注册一个回调函数,该回调函数在每次绘制之前被调用,用于准备下一帧要显示的图片。
由于mutable_image控件本身不带有获取视频或摄像头画面的功能,因此获取画面数据的操作可以借助第三方库(如:OpenCV)来实现。mutable_image为了以最高性能绘制,会采取和当前LCD相同的位图数据格式(调用lcd_get_desired_bitmap_format 获取)因此为了兼容不同LCD格式,可以在回调函数中写好不同格式的拷贝像素逻辑。

下面则是利用OpenCV接口获取摄像头数据并显示到mutable_image控件的部分代码示例:

static cv::Mat cv_image;static cv::VideoCapture cv_capture;
/* mutable_image_set_prepare_image回调函数 */ret_t mutable_image_prepare_image(void* ctx, bitmap_t* image) { uint8_t* image_buff = NULL; uint32_t bpp = bitmap_get_bpp(image); widget_t* widget = WIDGET(ctx); bitmap_format_t format = (bitmap_format_t)image->format; cv_capture >> cv_image; image_buff = bitmap_lock_buffer_for_write(image); for (int h = 0; h < image->h; ++h) { uint8_t* p_buff = image_buff + image->w * h * bpp; for (int w = 0; w < image->w; ++w) { /* 调用OpenCV接口获取摄像头当前帧的原始RGB数据 */ cv::Vec3b val = cv_image.at(h, w); if (format == BITMAP_FMT_RGB888 || format == BITMAP_FMT_RGBA8888) { /* RGB888或 RGBA8888示例, 由于该示例上面cv::at数据的格式为BGR,需要进行转换, 具体是否需要转换根据实际格式而决定 */ uint8_t blue = val[0]; uint8_t green = val[1]; uint8_t red = val[2]; p_buff[0] = red; p_buff[1] = green; p_buff[2] = blue; if (format == BITMAP_FMT_RGBA8888) { p_buff[3] = 255; } p_buff += bpp;
} else if (format == BITMAP_FMT_BGR888 || format == BITMAP_FMT_BGRA8888) { ... } else if (format == BITMAP_FMT_BGR565) { } else if (format == BITMAP_FMT_RGB565) { ... } } }
return bitmap_unlock_buffer(image);}
ret_t camera_open(widget_t* win) { widget_t* mutable_image = widget_child(win, "mutable_image");
cv_capture.open(0); mutable_image_set_prepare_image(mutable_image,mutable_image_prepare_image, mutable_image); return RET_OK;}

上面代码通过设置mutable_image控件的回调函数,在回调函数里面使用OpenCV的API获取到摄像头原始RGB数据,最后将数据写到mutable_image控件画面缓冲区上。

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

    关注

    6

    文章

    1903

    浏览量

    72223
  • 摄像头
    +关注

    关注

    59

    文章

    4695

    浏览量

    93658
  • C语言
    +关注

    关注

    180

    文章

    7552

    浏览量

    131990
  • awtk
    +关注

    关注

    0

    文章

    31

    浏览量

    181
收藏 人收藏

    评论

    相关推荐

    android多摄像头同时预览

    程序可以打开,预览画面还算流畅,大概25帧左右。调试USB摄像头通过UVC生成了video节点,接着移植了camera的HAL层库文件,可以顺利打开。当要调用第二个USB摄像头的时候就会遇到一些麻烦
    发表于 01-18 14:55

    怎么在在无人机上加摄像头,将拍摄画面实时传回,在电脑屏幕播放

    在无人机上加摄像头,将拍摄画面实时传回,在电脑屏幕播放推荐课程:张飞四旋翼飞行器视频套件,76小时吃透四轴算法http://t.elecfans.com/topic/40.html?e
    发表于 10-30 19:27

    怎样通过串口传输摄像头画面

    各位大神们,帮帮忙啊~~~~~怎样通过串口显示摄像头画面呢让画面实时显示在labview前面板上面。。当然 最好有个做好的小例子参考一下就最好啦
    发表于 03-08 10:25

    关于网络摄像头本地化的方法

    协议。所以用ONVIF Device Manager来查看局域网中的摄像头如图左边能看到摄像头IP。右下角能查看到RTSP视频流链接。复制这个链接接着打开VCam,选择流媒体在地址栏粘贴上面复制的rtsp链接[img=110,0
    发表于 05-30 09:21

    OV7670摄像头模块是如何实现摄像头画面上传到onenet的

    OV7670摄像头模块是如何实现摄像头画面上传到onenet的?
    发表于 09-30 08:53

    OKMX6Q_C外接ov5640摄像头视频画面会闪烁是什么原因呢

    我用OKMX6Q_C外接一个ov5640摄像头,使用forlinux qt5 ov5640应用打开预览时,发现如果在摄像头上快速度移动时(如手),视频画面会闪烁,像有一条切线一样。不知
    发表于 01-10 06:47

    使用Arduino和网络摄像头的基本视频流?

    我知道很多人说 arduino 不是处理视频的最佳方式,但我在使用 OctoPi(基于 arduino 的 3D 打印平台,还具有网络摄像头流)方面经验丰富,所以我知道它能够做我想做的事情想。 我
    发表于 05-04 06:51

    mp4文件伪装摄像头画面

    电子小白,在网上苦苦寻求方案,请各位路过大侠指点: 主管交代,要弄一个Android设备。 能够用 mp4 视频文件伪装成摄像头画面,然后循环播放。 不知道能不能实现呢,请大家提供下思
    发表于 05-10 18:37

    基于DirectShow的多摄像头视频采集

    1.为什么使用DirectShow 笔者使用的是两个USB摄像头,单摄像头视频采集使用OpenCV的VideoCapture类没有问题,但是双摄像头就有问题,一个正常,另外一个采集不到
    发表于 02-08 03:24 3128次阅读

    使用Python OpenCV读取摄像头视频文件并播放显示的详细说明

    要从摄像头视频文件读取视频,首先导入opencv 库cv2. 使用cv2.VideoCapture() 方法创建一个VideoCapture 对象。该方法接收
    发表于 01-19 16:57 5次下载

    特斯拉车内摄像头视频画面曝光

    近日,有外媒爆料消息称:国外圈内某位知名的大神留露放出了几段关于特斯拉model 3汽车内的摄像头拍摄画面高清视频视频透露了特斯拉model 3汽车车内的后视镜疑似遮挡部分了
    的头像 发表于 04-07 09:20 2985次阅读

    如何选择视频会议摄像头

    企业通信系统具有多元化的特点。在视频会议系统的采购中,必须以需求为主,视频会议摄像头也是如此。必须根据视频会议场地的大小进行选择,不同的是数码变焦
    发表于 04-26 10:57 1926次阅读

    labview本地视频摄像头资料

    labview本地视频摄像头资料
    发表于 12-30 09:59 33次下载

    27系列DGUS智能屏发布:可实时播放高清模拟信号摄像头视频

    针对高清晰度的模拟信号摄像头视频画面的显示需求,迪文特推出27系列DGUS智能屏。该系列智能屏可适配常见的AHD摄像头、CVBS摄像头,支持
    的头像 发表于 12-14 08:13 350次阅读
    27系列DGUS智能屏发布:可实时<b class='flag-5'>播放</b>高清模拟信号<b class='flag-5'>摄像头</b><b class='flag-5'>视频</b>

    高清网络摄像头多媒体智能屏

    迪文全新推出的28系列智能屏,是面向屏幕实时显示高清网络摄像头视频画面应用的产品。该系列智能屏可通过以太网WiFi连接摄像头,可接收H.2
    的头像 发表于 02-19 13:21 298次阅读
    高清网络<b class='flag-5'>摄像头</b>多媒体智能屏