GTAV:原始影像和深度图获取

背景

GTAV是一个非常好的游戏,目前也已经被广泛应用到深度学习之中了。本篇博客简单介绍一下如何采集数据。


1.数据采集

1. 代码修改

本篇博客的代码来源于GTAVisionExport。但是上述代码中,存在些许问题,经过调整后的代码如下:
https://github.com/Yannnnnnnnnnnn/GTAVisionExport。
主要修改的模块是:

  1. 使用二进制保存数据
  2. 调整深度渲染器分辨率,保持与游戏界面大小一致

此处,简单提一下GTAVisionExport的使用规则:

  1. 需要拷贝ScriptHookV的bin目录下的文件和上述代码编译生成的GTAVisionNative.asi & GTAVisionNative.lib到游戏根目录
  2. 关闭界面上的所有提示,包括地图、警告、字母等等;
  3. 采集数据前,应多次按键V,调整视角至第一人称。
2.去掉相机畸变

下图展示了一个使用上述代码采集数据的结果,可以发现在边缘部分,深度图和原始照片并不完全对应;产生的主要原因是因为相机畸变。
在这里插入图片描述
在这里插入图片描述
本文使用mod(https://www.gta5-mods.com/misc/no-chromatic-aberration-lens-distortion-1-41)修正相机畸变,方法是下载一个OpenVI,然后首先Tools->ASI Manger安装mod
在这里插入图片描述
然后把刚刚mod解压的三个timecycle_mods_1.xmltimecycle_mods_3.xmltimecycle_mods_4.xml拷贝到Grand Theft Auto V \ update \ update.rpf / common / data / timecycle下即可(使用openVI打开rpf文件)。

修正畸变后的结果如下,明显相机畸变不存在了。
在这里插入图片描述
在这里插入图片描述


2.数据读取

GTAVisionExport生成的数据是原始二进制块,可以借助opencv转换成上述图,基本代码如下:

1. depth
	FILE *fp;
	fp = fopen('depth.raw',"rb");
	float *data = new float[1920 * 1080];
	fread((void*)data, sizeof(float), 1920 * 1080, fp);
    fclose(fp);

    // 深度值需要矫正
    double b = 10003.814*0.15 / (-0.15 + 10003.814);
	double k = 10003.814 / (-0.15 + 10003.814) - 1.0;
	Mat img = cv::Mat::zeros(cv::Size(1920, 1080), CV_32FC1);
	for (int y = 0; y < 1080; y++)
	{
		for (int x = 0; x < 1920; x++)
		{
			img.at<float>(y, x) = b / (data[(y * 1920 + x)] + k);
		}
	}

	double minValue, maxValue;
	cv::minMaxIdx(img, &minValue, &maxValue);
	img = 255*(img - minValue) / (maxValue - minValue);
	img.convertTo(img, CV_8UC1);
	cv::Mat out;
	cv::applyColorMap(img, out, cv::COLORMAP_JET);
	cv::imwrite("depth.jpg", out);
	delete[]data;
	return 0;
2.rgb
	FILE *fp;
	fp = fopen("rgb.raw","rb");
	unsigned char *data = new unsigned char[4*1920 * 1080];
	fread((void*)data, sizeof(unsigned char), 4*1920 * 1080, fp);
	fclose(fp);

	Mat img = cv::Mat::zeros(cv::Size(1920, 1080), CV_8UC3);
	for (int y = 0; y < 1080; y++)
	{
		for (int x = 0; x < 1920; x++)
		{
			unsigned char r = data[ (y * 1920 + x) * 4 + 2 ];
			unsigned char g = data[ (y * 1920 + x) * 4 + 1];
			unsigned char b = data[ (y * 1920 + x) * 4 + 0];
			img.at<Vec3b>(y, x)[0] = r;
			img.at<Vec3b>(y, x)[1] = g;
			img.at<Vec3b>(y, x)[2] = b;

		}
	}

	cv::imwrite("color.jpg", img);
	delete[]data;
	return 0;
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值