您当前的位置: 首页 >  网络

qianbo_insist

暂无认证

  • 0浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

打造网络显示矩阵

qianbo_insist 发布时间:2021-07-14 07:51:28 ,浏览量:0

使用sdl2

sdl2是一个显示工具,Simple DirectMedia Layer is a cross-platform development ,跨平台媒体显示层 sdl2 官网 无论在何种操作系统中,我们都可以使用其良好的特性和高性能。

显示矩阵

我们可以使用一个SDL2 窗口来显示多个画面,而没有必要使用多个sdl2 窗口,以下是显示矩阵的真实画面,画面来自于rtsp协议的各个摄像头,并且叠加了文字。有关于rtsp协议,可以参考我的其他文章。 show

在渲染的过程中,我们是可以使用一个窗口来分割显示,这样只有一个显示窗口,比起多窗口显示多画面,节省了很多资源。以下为显示分割算法。画面分割为行列,xn 和 yn 为分割的行列,算法求出显示的矩形区域。

//准备显示的区域
void calc_show_rect(int x1, int y1, int x2, int y2, int xn, int yn,
	vector & txbuf,int pixelx,int pixely)
{
	//电影画格个数
	bool inflag = false;
	if (txbuf.size() != xn*yn){
		//清除
		auto iter = txbuf.begin();
		while (iter != txbuf.end()){
			delete *iter;
			iter++;
		}
		txbuf.clear();
		//必须插入
		inflag = true;
	}
	size_t movesize = xn * yn;
	float cx = x2-x1;
	float cy = y2-y1;
	if (xn > 0 && yn > 0)
	{
		float w = cx / (float)xn;
		float h = cy / (float)yn;
		//int n = -1;
		int nx;
		int ny;
		//auto iter = wins.begin();
		for (size_t n = 0; n rect);
			//tx->rect.x = x1+nxpos;
			//tx->rect.y = y1+nypos;
			//tx->rect.w = w;
			//tx->rect.h = h;
		}
	}
}
单个区域成比例显示算法

上面的函数中有一个cal0 函数,是为了计算显示区域的图像成比例,否则拉伸会把图像扭曲。


/*
   w: 视频宽度
   h: 视频高度
*/
int calc0(int w, int h, SDL_Rect &canvas, SDL_Rect& rect){
	if (w = h){
		rect.w = w;
		rect.h = h;
		rect.x = canvas.x + (canvas.w - w) / 2;
		rect.y = canvas.y + (canvas.w - h) / 2;
	}
	else if (canvas.w = h){
		rect.w = canvas.w;
		rect.h = (float)canvas.w / scale;
		rect.x = canvas.x;
		rect.y = canvas.y + abs(canvas.h - rect.h) / 2;
	}
	else if (canvas.w > w && canvas.h copy_text(_pRender);
		tex++;
	}
}

void SDLPlayer::Present()
{
	SDL_RenderPresent(_pRender);
}
三维显示

我们可以利用这种方式在三维中画出显示矩阵,原理是一样的,下一次我们再放出三维的做法。 三维显示矩阵 三维的好处是: 1 、可以更多地利用空间, 2、在需要的时候,我们可以使用vr 3、可以加入三维本地场景。 希望能帮助到大家。

关注
打赏
1663161521
查看更多评论
立即登录/注册

微信扫码登录

0.0410s