大华相机YUV数据通过opencv转换成rgb, 叠加字符显示

最原始的yuv图像叠加文字的实现--手动操作像素 《Ndk中使用Mediacode解码》 《android mediacodec 编码demo(java)》 《NDK中使用mediacodec编码h264》 《Android native 层使用opengl渲染YUV420p和NV12》 《opengl 叠加显示文字》 《android studio 编译freeType》 直接在yuv图像上手动修改像素,把文字打上去。 这里是一个c语言的demo,文字的位图,直接写在代码中,工作量有限,只提取了阿拉伯数字0-9和两个符号: - ,对于显示时间来说.. 阅读详情
#include <iostream>
#include <dhconfigsdk.h>
#include <dhnetsdk.h>
#include <dhplay.h>
#include <Cv310Text.h>

#define PLAYPORT		0
#define IMAGE_HEIGHT	        720
#define IMAGE_WIDTH		1280
#define OSD_MAX_ROW		10
#define OSD_MAX_STR		80

HANDLE mutex;

typedef struct OSDfont{
	int fontSize;
	int rowStart;
	int rowWidth;
	int colStart;
	int colWidth;
	int fontSpace;
	int color_r;
	int color_g;
	int color_b;
}OSDFONT;

OSDFONT osdfont{30, 1, 60, 1, 20, 1, 255, 255, 255};
Cv310Text* osdText;

char osdRow[OSD_MAX_ROW];
char osdStr[OSD_MAX_ROW][OSD_MAX_STR];

void __stdcall DisConnectFunc(LLONG lLoginID, char* pchDVRIP, LONG nDVRPort, LDWORD dwUser)
{
    //disconnect...
}

void __stdcall HaveReConnect(LLONG lLoginID, char* pchDVRIP, LONG nDVRPort, LDWORD dwUser)
{
    //reconnect...
}

void CALLBACK RealDataCB(
	LLONG  lRealHandle,
	DWORD  dwDataType,
	BYTE  *pBuffer,
	DWORD  dwBufSize,
	LDWORD dwUser)	
{
	if (0 == dwDataType && dwBufSize > 0)
	{
		PLAY_InputData(PLAYPORT, pBuffer, dwBufSize);
	}
}

void CALLBACK DecCBFun(LONG nPort, char * pBuf, LONG nSize, FRAME_INFO * pFrameInfo, void* pUserData, LONG nReserved2)
{
	if (pFrameInfo->nType == T_IYUV){
		cv::Mat yuv(IMAGE_HEIGHT + IMAGE_HEIGHT / 2, IMAGE_WIDTH, CV_8UC1, pBuf);	//图片的宽高要与视频分辨率对应
		cv::Mat bgr;
		WaitForSingleObject(mutex, INFINITE);
		cv::cvtColor(yuv, bgr, CV_YUV2RGB_YV12);
		for (int i = 0; i < OSD_MAX_ROW; i++){   //通过Cv310Text进行叠加
			if (1 == osdRow[i])
				osdText->putText(bgr, osdStr[i], cv::Point((osdfont.colStart + 2) * osdfont.colWidth, (osdfont.rowStart + i) * osdfont.rowWidth), cv::Scalar(osdfont.color_b, osdfont.color_g, osdfont.color_r));
		}
		//cv::imshow("video", bgr);
		//cv::waitKey(1);
		ReleaseMutex(mutex);
	}
}

int main()
{
	osdText = new Cv310Text("字体.ttf");

	CvScalar size;
	size.val[0] = osdfont.fontSize;
	size.val[1] = 0.5;
	size.val[2] = osdfont.fontSpace * 1.0 / 10;

	float p = 1.0;
	osdText->setFont(NULL, &size, NULL, &p);

	for(int i = 0; i < OSD_MAX_ROW; i++){
		osdRow[i] = 1;
		strncpy(osdStr, "叠加测试ABCDE12345", OSD_MAX_STR);
	}
	
	const char* ip = "192.168.1.108";
	int port = 37777;
	const char* user = "admin";
	const char* passwd = "admin";
	
	PLAY_OpenStream(PLAYPORT, NULL, 0,100 * 1024);
	PLAY_SetDecCallBack(PLAYPORT, DecCBFun);
	PLAY_Play(PLAYPORT, NULL);
	
        CLIENT_Init(DisConnectFunc, 0);
        CLIENT_SetAutoReconnect(&HaveReConnect, 0);

	NET_PARAM stuNetParam = { 0 };
	stuNetParam.nConnectTime = 3000;
	CLIENT_SetNetworkParam(&stuNetParam);

	NET_DEVICEINFO_Ex stuDevInfoEx = { 0 };
	int nError = 0;

	LONG hLogin = CLIENT_LoginEx2(ip, port, user, passwd, EM_LOGIN_SPEC_CAP_TCP, NULL, &stuDevInfoEx, &nError);
	if (hLogin == 0)
	{
		std::cout << "CLIENT_LoginEx2 GetLastError: " << CLIENT_GetLastError() << std::endl;
		return 1;
	}

	LONG hPlay = CLIENT_RealPlay(hLogin, 0, NULL);
	if (0 == hPlay){
		std::cout << "CLIENT_RealPlay GetLastError " << CLIENT_GetLastError() << std::endl;
		CLIENT_Logout(hLogin);
		CLIENT_Cleanup();
		return 1;
	}
	if (FALSE == CLIENT_SetRealDataCallBack(hPlay, RealDataCB, NULL)){
		std::cout << "CLIENT_SetRealDataCallBack GetLastError " << CLIENT_GetLastError() << std::endl;
		CLIENT_StopRealPlay(hPlay);
		CLIENT_Logout(hLogin);
		CLIENT_Cleanup();
		return 1;
	}
	
	Sleep(60 * 1000);
	
	CLIENT_Logout(hLogin);
	CLIENT_StopRealPlay(hPlay);
	CLIENT_Cleanup();
	
	PLAY_Stop(PLAYPORT);
	PLAY_CloseStream(PLAYPORT);
	
	return 0;
}
参考链接: https://www.cnblogs.com/dwdxdy/p/3713990.html 


在视频上叠加OSD文字和Logo图标--ShowVideoWithOSD ShowVideoWithOSD -- 在视频上叠加OSD文字和Logo图标,采用渲染时叠加的方法,用到Directdraw API。 立即下载

相关推荐

FlightStream实战:如何用面元法在笔记本电脑上完成无人机气动分析(附NASA案例)

本文详细介绍了如何利用FlightStream面元法在笔记本电脑上高效完成无人机气动分析,包括其核心技术优势、NASA D8案例实战解析及高效工作流建立。FlightStream作为快速CFD分析工具,显著提升了早期设计阶段的迭代速度,适用于概念设计验证和多气动构型比较。

weixin_28363123的博客 260

openCV与freetype解决图片叠OSD的问题

注意:​先解压freetype-2.10.2.tar.xz压缩包,解压完成后用解压出来的Makefile进行编译,这里我是用的新的编译链(包含zlib,如果不包含的话需要用下面的命令来编译安装zlib),编译出错是正常的,是因为freetype是依赖于libpng的,而libpng依赖于zlib。wchar_t是C/C++的字符类型,是一种扩展的存储方式。主要是CvxText.hpp和CvxText.cpp,2个文件中的putWChar函数实现了字体的位图绘制,中文变成图片,然后去叠到图片上去。

weixin_42305921的博客 804

价值投资/指标选股(akshare)

利用akshare的数据源,可以获取所有的股票数据以及公开的财务数据,可以进行条件筛选,获取满足条件的股票。 这套模板可以用于价值投资,指标选股。选股周期为日线级别。然后结果可以邮箱发送。 import time import akshare as ak ## A 股上市公司的实时行情数据 stock_zh_a_spot_df = ak.stock_zh_a_spot() #print(stock_zh_a_spot_df) ##取前300测试 ##取前300测试 df_stock =...

qq_26742269的博客 1万+

C++ OSD水印叠加

视频相关领域(监控、LED大屏)很多场合可能会涉及到在一幅画面上进行文字或时间的叠加,常规做法都是在后端实现,即先渲染图像,然后叠加OSD文字信息,这种方法简单且高效。但是有些场合必须要求在前端进行叠加,比如监控领域中视频名称信息、时间信息等这些都需要在前端图像编码的时候就已经叠加到图像上,以防止用户修改和验伪。示例中采用jpeg图像作为底图,所以需要借助libjpeg将图像解码还原RGB原始图像数据,叠加OSD文字信息需借助freetype生成点阵RGB图像数据,然后对2个图像进行像素合并或重写。

老狼的专栏 947

5分钟搞定!用MCU GPIO实现零功耗一键开关机电路(附完整原理图)

本文详细介绍了如何利用MCU GPIO设计零功耗一键开关机电路,适用于便携式设备和电池供电项目。通过软硬件结合的方式,实现关机状态下的真正零功耗,同时提供智能开关机控制。文章包含完整原理图、元件选型指南和实际搭建技巧,帮助开发者在5分钟内完成高效电源管理方案。

weixin_28339967的博客 343

Maven的下载安装配置教程(详细图文)

目录 一、简单了解一下什么是Maven 二、maven的下载 三、maven的安装 四、maven的环境变量配置 五、setting文件配置 六、开发工具配置Maven 一、简单了解一下什么是Maven Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。 1.Maven翻译为“专家“, ”内行”的意思,是著名Apache公司下基于Java开发的开源项目。 2.Maven项目对象模型(POM)是一..

bakelFF的博客 12万+

使用QT对接大华网络摄像头SDK的示例程序(建议收藏)

初始化 大华网络摄像头的默认 IP 地址都是 192.168.1.108,首先将你的电脑和摄像头连接到同一个路由器下,假如你的路由器不是1网段,则对路由器进行设置。 然后在 IE 浏览器下输入192.168.1.108,并参考说明书对摄像头进行配置,用户名,密码等。 SDK库文件添加 到大华官网下载最新的 SDK 开发包, 下载地址:大华设备网络SDK 或者从这儿下载:https://download.youkuaiyun.com/download/u012534831/12567061 下载后解压出库文件和头文件

q2nAmor 1万+

手把手教你用AirSim生成无人机训练数据集:RGB/深度图/分割图全攻略

本文详细介绍了如何使用AirSim仿真插件在UE4环境中生成无人机训练数据集,涵盖RGB、深度图和分割图等多种模态数据的采集与处理。通过实战指南,读者可以掌握环境配置、多模态数据采集、自动化流程设计及数据后处理等关键技术,为无人机视觉算法开发提供高质量训练数据。

weixin_29008805的博客 449

NV21、NV12、YV12、RGB、YUV、RGBA、RGBX8888等图像色彩编码格式区别

YV12的数据接口,主要是用于第三方的设备对接居多,这个接口的u_stride, v_stride分别是(width+1)/2,如果出来的数据需要旋转,通过rotation_degree来控制旋转角度即可。NV21、NV12、YV12、RGB、YUV、RGBA、RGBX8888都是常见的图像颜色编码格式,它们之间的主要区别在于色彩空间和数据排列方式。这个接口也是主要用于特定的数据类型对接,NV21的数据,直接转I420后,对接即可,接口参数比较简单,不再赘述。RGBA的主要用于屏幕共享场景下。

大牛直播SDK 1万+

STM32H743的FDCAN使用方法(1):STM32CubeMX初始化代码生成

STM32H743的FDCAN使用方法(1):STM32CubeMX初始化代码生成。

kevin1499的博客 2567

RK3568平台开发系列讲解(音频篇)配置声卡

📢本篇文章介绍如何配置声卡。

内核笔记 2449

大华sdk使用问题

这是十年前的问题了,大华sdk使用的时候存在速度控制,逆向播放,退出缓慢,定位控制,停止播放画面停留等问题

lgs7907 3547

基于CANopen协议,实现机器人500-1000Hz高频控制(附实操实例) (1)

基于CANopen协议实现机器人500-1000Hz高频控制,核心不是“协议本身的性能极限”,而是“通过优化配置、硬件适配、软件调优,最大化发挥协议的实时性优势”。关键在于:以PDO为核心实现实时数据传输,以SYNC帧锁定高频同步周期,以精简冗余、优化硬件降低总线负载,同时通过实操调试解决周期漂移、延迟、干扰等问题。

start_up_go的博客 93

YUV数据上叠加中文字符

整体思路: 1.取yuv数据的y分量转化opencv中的Mat(C语言为 IplImage)数据 //叠加字符 if(imgUV == NULL) imgUV=cvCreateImage(cvSize(w,h),IPL_DEPTH_8U,1); memcpy(imgUV->imageData,pYUV,w*h); 2.使用GDI+将中文字符绘制为bmp位图与Ma...

sun_feel的博客 2452

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

OpenCV中的RGB与YUV转换

对OpenCV中RGB与YUV转换所要注意的地方进行详细记录。

生活就像海洋 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

opencv-python(六):颜色空间及转换

0. 颜色模式 RGB 模式(百万种颜色) CMYK 模式(四种印刷色) 索引模式(256 种颜色) 灰度模式(256 级灰度) 位图模式(两种颜色) 0.1 灰度模式 也就是灰度图(黑白照片),每个像素只有明暗变化,用0~255共256个亮度级来表示,用8个bit来表示,所以每个像素信息用8bit储存. 0.2 位图模式(二值图像) 即只有纯黑和纯白两种亮度,没有渐变的亮度级,通常用0表示纯黑,1表示纯白,所以每个像素信息用1bit表示即可 0.3 RGB模式:基于发光体(电子产品)的色彩模式 即用

xu.hyj 9248

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

C# 视频监控系列(10):服务器端——验证、设置画面质量、字幕叠加、板卡序列号...

前言      本章将服务器端几个非主要但常用的功能分享一下。   注意      本系列文章限于学习交流,注重过程,由于涉及公司,所以不提供源代码下载,非常抱歉!!但是请大家放心,核心、实现以及其他能够贴出来的代码我都会贴出来,并且争取尽所能的回答留言里的每一个问题,感谢大家关注,欢迎交流 :)   系列 1.     C# 视频监控系列(1):准备       2.     C...

weixin_33701294的博客 255

RGB&YUV图像视频格式

OpenCV中如果是单通道或者三通道一样的大的图像,直接使用copyTo()函数即可。对于yuv420的图像则不是适用。

IT菜鸟 2184

常用图像像素格式 NV12、NV2、I420、YV12、YUYV

文章目录 常用图像像素格式 RGB 和 YUVRGB 格式YUV 格式YUV采样YUV存储格式常见的像素格式YUV422:YUYV、YVYU、UYVY、VYUYYUV420:I420、YV12、NV12,、NV21 常用图像像素格式 RGB 和 YUV 近期由于项目需要,开始接触图像像素格式,因此在这里做一个小结。 像素格式描述了像素数据存储所用的格式,定义了像素在内存中的编码方式。RGB 和 YUV 为两种经常使用的像素格式。 RGB 格式 一般较为熟悉,RGB图像...

yaningli的博客 3044

opencv将YV12转换为BGR图像

opencv的转换方法调用如下,但是要求输入的图像的长和宽一定要是偶数的,否则报错! bgr = cv2.cvtColor(Yv12, cv2.COLOR_YUV2BGR_YV12) 实验结果如下: img = cv2.imread(path) copy_img=img.copy() Y_img = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) Yv12 ...

Touch_Dream的博客 2382

YUV RGB 常见视频格式解析

come from :http://www.cnblogs.com/qinjunni/archive/2012/02/23/2364446.html I420是YUV格式的一种,而YUV有packed format和planar format两种,而I420属于planar format的一种。   同时I420表示了YUV的采样比例4:2:0。4:2:0的YUV并不是说没有V分量,而是指对于...

zmjames2000 Just record 1743

大华摄像头获取yuv数据

这里我把从大华公司获取的资料代码贴出来,希望对大家有所帮助。 // DecCallBack.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include #include "dhnetsdk.h" #include #include "dhplay.h

那年晴天的博客 9998

调取大华SDK获取IPC音视频流并得到H264帧

通过调取大华摄像机SDK,获取的音视频码流,其格式为大华的私有格式。需通过大华的码流分析库StreamAnalyzer.dll将私有头和负载分离,从而提取出纯H264及音频帧数据。 第1步:调用sdk获取实况码流 LLONG lRet = CLIENT_RealPlayEx(m_LoginID,iChannel,0); if(0 != lRet) { m_DispHanle[iDispNum-1]=lRet; SetPlayVideoInfo(iDispNum,iChannel,ServerMode);

aflyeaglenku的博客(QQ1010316426) 8381

使用大华NetSDK对接大华相机

使用大华NetSDK对接相机 一、 下载大华NetSDK https://www.dahuatech.com/service/downloadlists/836.html 根据自己的需要下载对应版本的sdk。这边我们就以Win32版本作为开发使用。 下载的文件解压后,内部文件如下图所示: 开发使用到的文件在库文件和头文件目录中。使用手册和演示程序则提供了快速上手使用的说明和实例; 二、 使用NetSDK对接大华设备 1、 基本概念 设备发现: 在局域网中寻找大华设备,找到所有接入.

gaojunhuiwww的专栏 6158
上一篇: Ubuntu 打乱行
下一篇: CMFCButton控件改变颜色
HHCOO
博客等级 码龄10年 1粉丝 2原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值