视频与AI,与进程交互(一)

news2024/11/24 15:04:14

目的

    正在写一个视频与AI的工具,从接入,算法处理,转发,存储, 到调用AI进程,并且与AI进程进行交互,插件化,脚本化,做得比较辛苦,期间的进程和线程交互以及结果渲染到UI上逻辑必须严谨,否则以c++ 来说,UI处理不好,主进程容易崩溃。

    下图是为了进行交互的工具,与接入的各类方式,如rtsp 接入,rtp直接接入,ps GB28181 接入,rtmp接入,ts流接入等等,工具的制作异常艰辛,抛弃了很多项目,心无旁骛,淡看过往,—看似洒脱,实属无奈。
AI工具界面

2 深思

2.1 保证核心通用

既然是一个比较先进的工具,创新是必然的,然而我将创新放到了插件中,创新必须包含很多的灵活性,因为你是一种工具,是一种“空”,而世上只有空才能包容万物。组件插件化,脚本化,是保证核心逻辑通用的方式。

2.2 插件化

将图像运行,转发,AI,进行插件化,为每一路视频图像进行插件管理。接入是一种统一的外接入,为了使得动态库和主进程进行
在这里插入图片描述

3 数据结构

定义接入的数据结构要考虑很多问题

typedef struct s_param
{
	const char* name = NULL;//所属名称 如rtspclient
	const char* url = NULL;//唯一名称,or ip+port
	uint8_t* data = NULL;
	int len = 0;   //len = -1 收到结束 
	uint32_t ssrc;
	void* obj = NULL; //create 中传入的obj
	const char* ipfrom = NULL;
	int width = 0;
	int height = 0;
	uint16_t fport;
	uint16_t seq;//兼容rtp
	int codeid;  //与ffmpeg兼容
	int payload = -1; //payload type
	int64_t pts;
	void* decoder = NULL;
	uint8_t* extradata = NULL;
	int extradatalen = 0;
	//bool isnew = true; //是否是一个新的传输
	//void* rtspworker = NULL;
}s_param;

//回调函数是压缩流
typedef void(*func_callback)(s_param*  param);

typedef void(*func_callback_new)(void* obj, const char* url);
//len >0 vps sps pps 信息
//len = 0  
//len = -1 无法连接
//len = -2 read 出错
//len = -3 其他错误
typedef void(*func_callback_extra)(uint8_t* data, int len);
//

制作过程中接入视频以后才知道很多东西不能光靠想象,即使有几十年的视频经验,程序依然需要打磨,平时太多的demo制作,没有产品化好的弊端完全显露出来,即使是一个数据结构,也是改之又改。为了在工具中能够进行视频拼接,加入了很多方法:如下图所示
在这里插入图片描述
视频拼接是一个比较大的话题,我们以后再进行描述。以下是视频拼接的第一步算法,鱼眼矫正处理,加载了鱼眼矫正的插件动态库。

在这里插入图片描述
在这里插入图片描述
鱼眼矫正算法加载

extern "C"
{
	_declspec(dllexport) const char* WINAPI func_name();
	_declspec(dllexport) int WINAPI _fastcall func_worker(uint8_t* data, int w, int h, uint8_t* outdata);
	_declspec(dllexport) int WINAPI func_no();
}

以上是插件的接口定义,为了达到视频的无极缓存,需要从申请内存开始,到动态库图像算法,到转发,存储,再接入AI脚本,与AI脚本共享内存,一直使用同一份内存。
在这里插入图片描述

测试-图像鱼眼矫正算法载入

	//画一帧图像
	void func_draw(int px, int py, int drawrect)
	{
		AVFrame* frame = NULL;
		if (v_frames.dequeue(&frame))
		{

			/*cv::Mat nmat;
			nmat.cols = frame->width;
			nmat.rows = frame->height;
			nmat.data = frame->data[0];*/
			//装载畸形矫正算法
			//if (!v_funcs.empty())
			
			auto iter = v_plugins.begin();
			while (iter != v_plugins.end())
			{
				(*iter)->FUNC_worker(frame->data[0], frame->width, frame->height,NULL);
				iter++;
			}
			
			
			v_drawer.func_draw(px, py, frame, drawrect);
			{

				if (v_script != nullptr && !v_script->IsStop())
				{
					if (frame->key_frame)
					{
						//写入共享内存
						int w = frame->width;
						int h = frame->height;
						mem_info_ptr ptr = v_script->mem_getch_process(frame->data[0], w, h);
						if (ptr != nullptr)
						{
							v_script->v_in.Push(ptr);
							v_script->Notify();//通知取队列
						}
					}
					if (!v_script->v_out.IsEmpty())
					{
						//开始画子画面//子画面中开始画结果
						//v_script->
					}

				}


				
				std::lock_guard<std::mutex> lock(v_mutex_cache);
				if (v_cache != NULL)
				{
					av_freep(&v_cache->data[0]);
					av_frame_free(&v_cache);
				}
				//保存最后一帧当前帧
				v_cache = frame;
				//是否需要和python脚本进程交互
			}
		}
	}

鱼眼矫正图像是为了做多个摄像头做拼接而做的算法,整个逻辑接入,到绘制到UI上,都通过一个回调而进入核心绘制程序,所以回调的地方会有很多逻辑分离代码。

4 进程通信

1 lua
与脚本交互,1 是lua语言, 2 是javascript语言,3 是glsl 语言 4 就是需要常用的AI 处理 python
lua的想法很一般,就是c++ 提供API, 提供httpserver和websocket server,lua组织一下基本启动,当然,lua有一个好处就是不用配置文件了,配置文件直接就包含在lua 脚本里面就行

2 javascript
更简单,直接调用javascript 函数,反之javascript调用c++ 函数,嵌入v8 引擎。

2 python
这个是重点,就是c++ 到底如何驱动python, 需要一个进程管理还是简单调用,后来做起来发觉,确实需要进程管理,c++使用boost库做进程管理是比较方便的,不过先使用更简单的方案,就是使用异步调用进程和内存共享,

#include <iostream>
#include <string>
#include <vector>
//#include <boost/filesystem.hpp>
#include <algorithm>
#include <boost/process.hpp>


int main_face()
{
   //std::system("python.exe face.py");
   namespace bp = boost::process;
   //std::string child_process_name = "child_process";
   //std::cout << "main_process: before spawning" << std::endl;


   bp::child c(bp::search_path("python.exe"), "face.py");
  tcpclient  client;
   while (c.running())
   {
   	//printf("running");
       client.send();
        client.read();		
   }

   c.wait(); //wait for the process to exit   
   int result = c.exit_code();
}

使用boost去启动进程,做进程记录,并且在UI中要有处理进程管理的管理器。
使用tcp 协议去发送视频图像的某一帧已经准备好了在内存共享中,接收到tcp消息表明在内存共享中已经处理完毕,把消息插入到队列中,主进程进行发现并且渲染。

其他方式:
使用std::system 去启动进程,用c++ 的高级特性,async进行循环等待,依然使用tcp 或者udp进行通信,注意

void f()
{
	std::system("python.exe face.py");
}

int main()
{
	auto fut = std::async(f);          // 异步执行f

    udpclient client;
	while (fut.wait_for(1000ms) !=         // 循环直到f执行结束
		std::future_status::ready)          //意味着python程序已经退出进程
	{
	    client.send(w,h,number)
	    client.read(w,h,number)
		//tcp 或者udp 进行通信
		//消息入队列
		queue.push()
	}
}

使用boost 来进行进程上的管理,或者自行异步进行进程管理都是可行的,udp方式比tcp方式优势是udp其实本身也是半“异步的”, 在不绑定udp 的情况下,不用考虑udp 缓存处理,在绑定udp的情况下,udp 缓存到极限则会阻塞,我们只要加入udp 在接收到数据的情况下知道python进程已经准备好了就行,tcp 处理也是一样。

这是系列的一,我会继续完善这个工具,直到他比较方便、代码清晰的时候进行开源。下一篇文章,必然是这个工具取得比较大的进步了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于奥比中光深度相机进行虹膜识别处理

MATLAB仿真实现效果展示 图1 奥比中光红外深度相机拍摄效果 MATLAB仿真红外效果的图片&#xff0c;使用奥比中光的Astra_Pro深度相机和Astra进行拍摄&#xff0c;效果很好。 声明&#xff1a;本文的虹膜识别系统模型参考了西澳大利亚大学&#xff0c;计算机科学与软件工程学…

Spark 优化

1.RDD分区数 Task是作用在每个分区上的&#xff0c;每个分区至少需要一个Task去处理 改变分区数可间接改变任务的并行度&#xff0c;类似手动指定Reduce数量 第一个RDD的分区数由切片的数量决定 默认情况下子RDD的分区数等于父RDD的分区数 Shuflle类算子可手动指定RDD分区数 设…

chatgpt赋能python:Python屏幕截图并保存:简单易用的库

Python屏幕截图并保存&#xff1a;简单易用的库 屏幕截图是程序员们在软件开发中常用到的一个小技巧&#xff0c;对于调试、记录Bug、编写文档等方面有极大的帮助。而其中&#xff0c;Python成为了众多程序员的利器之一。 在Python中&#xff0c;大量的库提供了屏幕截图的方法…

PX4-机架选取(基于QG地面站)

因为我的无人机是F450&#xff0c;所以我选用F450的机架 点击应用后&#xff0c;要稍等一会 应用完成后在概述会标识

经纬度坐标为中心点生成米距离长度半径的圆形面,含java js源码+在线绘制,代码简单零依赖

文章目录 java版源码js版源码在线绘制预览效果关于计算的精确度 前些时间在更新我的坐标边界查询工具的时候&#xff0c;需要用到经纬度坐标点的距离计算&#xff0c;和以坐标点为中心生成一个指定距离为半径的圆&#xff0c;搜了一下没有找到现成简单又合适的代码&#xff0c;…

基于OpenCV 和 Dlib 进行头部姿态估计

写在前面 工作中遇到&#xff0c;简单整理博文内容涉及基于 OpenCV 和 Dlib头部姿态评估的简单Demo理解不足小伙伴帮忙指正 庐山烟雨浙江潮&#xff0c;未到千般恨不消。到得还来别无事&#xff0c;庐山烟雨浙江潮。 ----《庐山烟雨浙江潮》苏轼 https://github.com/LIRUILONGS…

2023智源大会议程公开 | 大模型新基建与智力运营论坛

6月9日&#xff0c;2023北京智源大会&#xff0c;将邀请这一领域的探索者、实践者、以及关心智能科学的每个人&#xff0c;共同拉开未来舞台的帷幕&#xff0c;你准备好了吗&#xff1f;与会知名嘉宾包括&#xff0c;图灵奖得主Yann LeCun、OpenAI创始人Sam Altman、图灵奖得主…

【模型评估】混淆矩阵(confusion_matrix)之 TP、FP、TN、FN;敏感度、特异度、准确率、精确率

你这蠢货&#xff0c;是不是又把酸葡萄和葡萄酸弄“混淆”啦&#xff01;&#xff01;&#xff01;这里的混淆&#xff0c;我们细品&#xff0c;帮助我们理解名词“混淆矩阵” 上面日常情况中的混淆就是&#xff1a;是否把某两件东西或者多件东西给弄混了&#xff0c;迷糊了。把…

数据隐私保护的最佳实践:全面了解数据脱敏方案

1、数据脱敏 数据脱敏是一种保护敏感信息的安全措施&#xff0c;通常会将真实数据替换成模拟数据或者经过处理后的数据。下面是常见的数据脱敏实现方案&#xff1a; 字符串替换&#xff1a;将需要脱敏的字符串中指定位置的字符替换为“****”或其他符号。例如&#xff0c;将银…

MySQL数据库误删恢复

前言 经常听说删库跑路这真的不只是一句玩笑话,若不小心删除了数据库,事情很严重。你一个不小心可能会给公司删没。建议研发不要直连生成环境,一般的话都会分配账号权限,生产环境的账号尽量是只读,以防你一个不经意给库或表删除。一定要备份,这很重要,这是一个血的教训。…

iTOP3568开发板-Buildroot 系统设置待机和锁屏

Weston 的超时待机时长可以在启动参数中配置,也可以在 weston.ini 的 core 段配置。 方法一&#xff1a; 修改文件系统中/etc/init.d/S50launcher 文件&#xff0c;如下图所示的红框&#xff0c;0 代表禁止待机&#xff0c;可自行设置待机时间&#xff0c;单位是秒。 方法二&a…

深浅拷贝各种实现方式性能

拷贝方式 拷贝方式类型原理备注Object.clone()默认 浅拷贝&#xff0c;可以自定义实现深拷贝对象内存复制constructor可以实现深拷贝自定义实现BeanUtil.copyProperties()浅拷贝利用 getter/setter 实现属性拷贝反射&#xff0c;spring utilCollectionUtils.clone()深拷贝本质…

强化学习驱动的低延迟视频传输

随着视频会议、视频直播的流行以及未来AR/VR业务的发展&#xff0c;低延迟视频传输服务被广泛使用&#xff0c;但视频质量&#xff08;QoE&#xff09;还不能满足用户要求。那么近年来新兴的AI神经网络是否能为视频传输带来智能化的优化&#xff1f;今天LiveVideoStack大会北京…

macos m1 pip install lightgbm error

MacOS M1电脑&#xff0c;执行 pip install lightgbm 错误如下&#xff1a; 尝试如下操作&#xff1a; 参考链接如下&#xff1a; https://github.com/Microsoft/LightGBM/issues/1324 brew install cmake brew install gcc git clone --recursive https://github.com/Micro…

Unity之OpenXR+XR Interaction Toolkit接入HTC Vive解决手柄无法使用的问题

前言 随着Unity版本的不断进化,VR的接口逐渐统一,现在大部分的VR项目都开始使用OpenXR开发了。基于OpenXR,我们可以快速适配HTC,Pico,Oculus,等等设备。 今天我们要说的问题就是,当我们按照官方的标准流程配置完OpenXR后(参考:Unity之OpenXR+XR Interaction Toolkit…

西门子S7-200 CPU输入/输出接线说明

总结来看&#xff0c;S7-200系列PLC提供4个不同的基本型号的8种CPU&#xff0c;其接线方式也可大致分为6种&#xff1a; 1.CPU SR20接线 2.CPU SR40接线 3.CPU CR40接线 4.CPU ST40接线 5. CPU SR60接线 6. CPU ST60接线 除了CPU外&#xff0c;我们还需要了解200smart PLC的数…

排序算法大总结(插入、希尔、选择、堆、冒泡、快速、归并、计数)

1. 排序概要2. 插入排序直接插入排序希尔排序&#xff08;缩小增量排序&#xff09; 3.选择排序直接选择排序堆排序 4. 交换排序冒泡排序快速排序霍尔版本&#xff08;hoare&#xff09;挖坑法双指针版本快排优化快速排序非递归 5. 归并排序归并递归版本归并非递归版本 6.计数排…

物联网开发项目中具备哪些特点?

物联网开发是一项由设备、传感器、系统和应用程序组成的复杂技术。许多公司已经制定了计划&#xff0c;准备将物联网技术整合到他们的系统中&#xff0c;以帮助提高效率和生产力。在许多方面&#xff0c;物联网都是一项技术投资&#xff0c;但与其他投资相比&#xff0c;它可以…

RFID如何提升工业物流管理效率?

RFID技术目前已经在工业物流行业中广泛应用&#xff0c;企业只要将附带产品信息的RFID标签贴在货物上&#xff0c;利用工业读写器&#xff0c;可以快速准确地读取货物信息&#xff0c;提高仓库管理效率。 RFID如何提升工业物流管理效率? 1、跟踪货物 RFID技术可帮助企业跟踪货…

声表面波滤波器圆片级互连封装技术研究

陈作桓&#xff0c;于大全&#xff0c;张名川 厦门大学&#xff0c;厦门云天半导体科技有限公司 摘要 射频前端模块是无线通信的核心&#xff0c;滤波器作为射频前端的关键器件&#xff0c;可将带外干扰和噪声滤除以保留特定频段内的信号&#xff0c;满足射频系统的通讯要求…