用OLED屏幕播放视频(3): 使用cuda编程加速视频处理

这篇具有很好参考价值的文章主要介绍了用OLED屏幕播放视频(3): 使用cuda编程加速视频处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

下面的系列文章记录了如何使用一块linux开发扳和一块OLED屏幕实现视频的播放:

  1. 项目介绍
  2. 为OLED屏幕开发I2C驱动
  3. 使用cuda编程加速视频处理

这是此系列文章的第3篇, 主要总结和记录了如何使用cuda编程释放GPU的算力. 在此之前尝试过使用python调用opencv直接处理视频数据, 但使用之后发现处理过程效率不高, 处理时间偏长. 后来想到还有一块显卡没利用起来, 毕竟也是在某国产GPU厂商做过开发的, cuda编程也算是传统艺能了. 最终效果看下面的视频:

跳转到6:48, 直接观看演示

1). 要用GPU做什么

这里不会介绍cuda的编程模型, cuda开发工具的使用等, 这部分内容可以参考cuda的官方文档, 学习cuda编程的话, 看这个文档就足够了.

原始的视频文件, 每帧画面的分辨率一般不会和我们的屏幕尺寸128x64匹配, 并且视频是彩色的, 使用的OLED屏幕只能显示黑白图像. 所以视频的数据必须经过resize和灰度处理之后才能发送给beaglebone black板子连接的OLED屏幕, 这部分视频处理工作就是在GPU上进行的.

用OLED屏幕播放视频(3): 使用cuda编程加速视频处理

在host machine上的python程序使用opencv读取视频文件中的每一帧, 通过socket发送给cuda程序; cuda程序处理完数据之后, 再通过socket把数据发送给beagle board上的用户态程序; beagle board上的用户态程序, 把一帧数据写入屏幕, 完成绘制.

2). kernel函数的算法实现

下面是kernel函数的部分代码, oframe, ow, oh, 分别表示原始画面数据, 原始的宽度和高度, nframe, nw, nh分别表示处理之后的画面数据, 新的宽度和高度.

kernel中的resize操作, 使用最近临方式, (i, j)是新画面中的像素位置, 计算得到对应的原始画面像素位置(oi, oj), 取出原始的rgb值, 使用公式计算出亮度, 最后根据阈值确定(i, j)这个像素的亮灭.

__global__ void resize_frame_kernel(unsigned char *oframe, int ow, int oh,
				    unsigned char *nframe, int nw, int nh,
				    int threshold, unsigned int *locks)
{
	for (int i = blockDim.x * blockIdx.x + threadIdx.x; i < nw;
	     i += blockDim.x * gridDim.x) {
		for (int j = blockDim.y * blockIdx.y + threadIdx.y; j < nh;
		     j += blockDim.y * gridDim.y) {
			int oi = i * ow / nw;
			int oj = j * oh / nh;

			unsigned char b = oframe[oj * ow * 3 + oi * 3];
			unsigned char g = oframe[oj * ow * 3 + oi * 3 + 1];
			unsigned char r = oframe[oj * ow * 3 + oi * 3 + 2];

			unsigned char brightness =
				r * 0.3 + g * 0.59 + b * 0.11;
			brightness = brightness >= threshold ? 1 : 0;
			brightness = brightness << (j % 8);
			// 以下代码实现了一个自旋锁
			bool leaveloop = false;
			while (!leaveloop) {
				if (atomicExch(&locks[j / 8 * nw + i], 1u) ==
				    0u) {
					nframe[j / 8 * nw + i] |= brightness;
					leaveloop = true;
					atomicExch(&locks[j / 8 * nw + i], 0u);
				}
			}
		}
	}
}

3). kernel函数中的并发问题

在上面的代码清单中使用原子交换指令atomicExch实现了一个自旋锁. 在kernel函数中使用锁是因为, nframe的大小是128x8字节, 屏幕分辨率是128x64, nframe的每个bit控制一个像素, 当kernel中更新nframe时, 可能同时有多个线程想更新nframe中的同一个字节. 关于这个自选锁中while循环的写法, 可以参考stack overflow.

4). 文末推广

欢迎关注我的B站账号, 或者加入QQ群838923389, 一起研究计算机底层技术, 一起搞事情:P文章来源地址https://www.toymoban.com/news/detail-700258.html

到了这里,关于用OLED屏幕播放视频(3): 使用cuda编程加速视频处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 显示器屏幕oled的性能、使用场景、维护

    OLED显示器屏幕具有许多独特的性能和使用场景,以下是关于OLED显示器屏幕的性能、使用场景和维护的详细介绍: 一、性能 色彩鲜艳:OLED显示器屏幕能够呈现出更加鲜艳的色彩,色彩饱和度高,色彩还原性好,可以给用户带来更加真实的视觉体验。 对比度高:OLED显示器屏幕

    2024年02月03日
    浏览(43)
  • uniapp使用video标签无法播放视频出现黑屏问题处理

    问题出现情况 并且点击播放后出现报错 解决办法 问题出现的原因可能是video的视频流不兼容或者在f12下无法看见视频文件导致的,所有我们使用computed计算属性来解决这个问题 js html 按照上面的做法 这样问题就解决了 希望能解决大家的问题 一键三连

    2024年02月11日
    浏览(81)
  • 【网页上视频无法拖动进度条,如何进行加速播放操作以及网页失焦后如何可继续播放】

    遇到一 zhengzhi 刷题任务时 ,发现无法拖动进度条,也没有加速播放并且鼠标一失焦就会自动暂停时,让我乖乖看完是不可能,因此找了一个解决方案快速完成该任务 1、首先点击键盘F12键,进入开发者模式 发现标志, html5播放器,属于原生支持最方便实现加速的 顺带复习下

    2024年02月02日
    浏览(51)
  • Unity 安卓(Android)端AVProVideo插件播放不了视频,屏幕一闪一闪的

    编辑器运行没有问题,但是安卓就有问题,在平板上运行就会报错: vulkan graphics API is notsupported 说不支持Vulkan图形API,解决方法:把Vulkan删除掉

    2024年02月09日
    浏览(33)
  • STM32初学入门笔记(5):使用STM32CubeMX通过SPI,IIC驱动OLED屏幕

    随着时代的进步,OLED显示屏成为了继LCD显示屏之后的新一代显示屏技术,OLED具有可视角高,功耗低,厚度薄,耐冲击、振动能力强,像素响应时间低等优点,在嵌入式开发中,OLED显示器也是一个主要的部分,制作OLED显示模块的驱动也是学习STM32路上的重要一部分,本篇将从

    2024年02月04日
    浏览(41)
  • 使用OpenCV和CUDA实现更好的模型加速

    作者:禅与计算机程序设计艺术 随着计算机视觉技术的发展和应用领域的广泛拓展,人们越来越多地将注意力集中在如何提升机器视觉系统的性能上。近年来,深度学习(Deep Learning)和高性能计算(High Performance Computing,HPC)等新兴技术正朝着成为主流的方向发展。基于深度

    2024年02月09日
    浏览(53)
  • Gstreamer中的视频处理与硬件加速

     点击上方“LiveVideoStack”关注我们 ▲扫描图中 二维码 或点击 阅读原文 ▲ 了解音视频技术大会更多信息   //   编者按: Gstreamer作为一个比较流行的开源多媒体框架,其优秀的架构使其具有高度的模块化和良好的扩展性,并具有广泛的应用前景。LiveVideoStackCon2022上海站大会

    2024年02月01日
    浏览(37)
  • 配置Tensorflow使用CUDA进行GPU加速(超详细教程)

    对于刚使用Tensorflow的友友来说配置环境并使用GPU进行加速也是件令人头疼的事情,纯自己折腾会遇到比较多的坑,所以这里详细介绍一下Tensorflow的环境配置 先进入官网查看Tensorflow依赖信息: 目前Tensorflow版本已经更新到2.16.1但是中文官网发布的最新经过测试的构建配置的

    2024年04月22日
    浏览(32)
  • STM32设计实现智能温度计(OLED屏幕的使用,多级屏幕转换,扫描键盘法的搭建、DS180B20温度传感器的使用、实现上位机的可视化)

    智能温度计的设计 设计内容 1)一路温度检测,量程为-40℃~+125℃,误差≤±0.5℃; 2)温度3位数码显示(XX.X℃); 3) 开机自检; 4)配简单键盘,如温度上、下限临界报警值设置; 5)配置通信接口,上位机显示温度曲线。 单片机(32、51)、温度传感器()、键盘、LCD、 我

    2024年02月10日
    浏览(41)
  • 使用c++onnxruntime部署yolov5模型并使用CUDA加速(超详细)

    前言 1.Yolo简介 2.onnxruntime简介 3.Yolov5模型训练及转换 4.利用cmake向C++部署该onnx模型 总结 接到一个项目,需要用c++和单片机通信,还要使用yolo模型来做到目标检测的任务,但目前网上的各种博客并没有完整的流程教程,让我在部署过程费了不少劲,也踩了不少坑(甚至一度把

    2024年02月02日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包