Linux下开启Astra摄像头,获取数据流和显示图像

这里提供两种方式:

第一种:对于新手建议,下载官方Linux驱动,直接运行官方所给的示例程序即可,Linux下比Windos稍微简单,直接使用脚本编译即可。

具体步骤:(1)下载驱动并解压之后会得到一个文件夹,如下图所示:

(2)Linux环境下打开终端进入samples目录,运行sample_build.sh 脚本文件即可。

命令为:bash sample_build.sh +编译平台

(3)这里要注意不同编译平台命令不同:

例如:x86_64:编译linux64 , arrch64:编译arrch64

答主这里是arm 所以使用命令是:bash sample_build.sh arrch64

这个脚本会将下边所有的示例程序编译,比较久,大家可以打开CMakeLists,将不需要编译的屏蔽。

这里我只编译了SimpleViewer程序,此程序会将深度和RGB图像显示出来。

出现如下即视为编译成功:

 

然后cd build/bin  进入bin文件夹

输入sudo ./SimpleViewer即可 

运行效果如下:

 第二种方式为自己编写驱动,这个对于新手来说比较麻烦,因为需要配置OpenNi环境,优点是代码小比较简单。

这个是我简化后写的一个驱动程序,可供参考。支持UVC相机和Astra plus、Gemini模组和模组。

int main(int argc, char *argv[])
{
	char* buf = (char*)malloc(640 * 480 * 2 + 640 * 480 * 3);
	if (buf == NULL)
	{
		printf("malloc error\n");
		return 0;
	}
	memset(buf, 0, sizeof(buf));
	//设备初始化
	d2cSwapper* pD2CSwapper = NULL;
	pD2CSwapper = new AstroProD2C();
	int nRet = pD2CSwapper->CameraInit(NORMAL_NO);
	if (nRet != CAMERA_STATUS_SUCCESS)
	{
		printf("camera init failed\n");
		getchar();
		return -1;
	}
	ObD2CType d2cType = NORMAL_NO;
	//获取相机内外参
	SW_D2C soft_d2c;
	memset(&soft_d2c, 0, sizeof(SW_D2C));
	OBCameraParams cameraParams;
	memset(&cameraParams, 0, sizeof(OBCameraParams));
	nRet = pD2CSwapper->GetCameraParam(cameraParams);
	if (nRet != 0)
	{
		//获取相机内外参失败
		printf("get camera param failed\n");
		return -1;
	}
	//获取设备的分辨率
	int nWidth = 0;
	int nHeight = 0;
	nRet = pD2CSwapper->GetCameraResolution(nWidth, nHeight);

	if (nRet != 0)
	{
		printf("get camera resolution fail,please check pid\n");
		return -1;
	}
	bool bExit = true;
	uint16_t nPid = pD2CSwapper->GetDevicePid();
	//开关流
	int nDepthWidth = 0;
	int nDepthHeight = 0;
	nDepthWidth = IMAGE_WIDTH_640;
	nDepthHeight = IMAGE_HEIGHT_480;
	std::thread pThreadSend(thread_send_data);
	pThreadSend.detach();
	while (bExit)
	{
		cv::Mat cv_rgb(IMAGE_HEIGHT_480, IMAGE_WIDTH_640, CV_8UC3);
		cv::Mat cv_rgb1(IMAGE_HEIGHT_480, IMAGE_WIDTH_640, CV_8UC3);
		cv::Mat cv_depth(nDepthHeight, nDepthWidth, CV_16UC1);//640x480
	    //获取数据
		int nRet = pD2CSwapper->GetStreamData(cv_rgb, cv_depth);
		cv::flip(cv_rgb, cv_rgb1, 1);
		cv::imshow("Show Rgb", cv_rgb1);
		cv::imshow("Show Depth", cv_depth);
		cv::waitKey(1000 / 1000);
	}
	nRet = pD2CSwapper->CameraUnInit();
	printf("UvcDeInit :%d\n", nRet);
	if (pD2CSwapper)
	{
		delete pD2CSwapper;
		pD2CSwapper = NULL;
	}
    free(buf);
	return 0;
}

头文件为\samples\samples\SimpleViewer路径下的文件。

奥比不同的传感器获取数据流的方式不同,除了上述这种,还有一种如下所示:

    streamDepth.readFrame(&frameDepth);
	streamColor.readFrame(&frameColor);

获取之后,执行我们想要的操作即可。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值