双目相机的读取和拆分

双目相机的读取和拆分


使用的双目相机型号
相机尺寸
这款型号的双目读出来的是左右拼接在一起的帧,需要另外分割一下使其分离。

分辨率有三种格式:640x240(分离后左右每帧320x240),1280x480(分离后每帧640x240),2560x960(分离后每帧1280x480)。
注意:可以更改分辨率,但是无论你的分辨率怎么改,最后都会默认成设置最接近的三种分辨率之一,感兴趣的可以试试。

我把每帧分离后分别保存到不同文件夹中,运行之后按空格键就可以保存当前帧。

在这里插入代
#include <opencv2/opencv.hpp>
#include <iostream>
#include<opencv2\highgui\highgui.hpp>

using namespace cv;
using namespace std;


void CornerHarris_Demo(int, void*);
Mat  frame, img, gray, dst;
Mat leftImg, rightImg;

int main(int argc, char** argv)
{

	//videocapture结构创建一个catture视频对象
	VideoCapture capture;
	//连接视频
	capture.open(1); 
	if (!capture.isOpened()) {
		printf("could not load video data...\n");
		return -1;
	}
	int frames = capture.get(CAP_PROP_FRAME_COUNT);//获取视频针数目(一帧就是一张图片)
	int fps = capture.get(CAP_PROP_FPS);//获取每针视频的频率
	capture.set(CAP_PROP_FRAME_WIDTH,1280);
	capture.set(CAP_PROP_FRAME_HEIGHT,480);
	int WIDTH = capture.get(CAP_PROP_FRAME_WIDTH);
	int HEIGHT = capture.get(CAP_PROP_FRAME_HEIGHT);
	// 获取帧的视频宽度,视频高度
	Size size = Size(capture.get(CAP_PROP_FRAME_WIDTH), capture.get(CAP_PROP_FRAME_HEIGHT));
	cout << frames << endl;
	cout << fps << endl;
	cout << size << endl;
	capture >> frame;
	cout << frame.cols << "  " << frame.rows << endl;
	// 创建视频中每张图片对象
	namedWindow("video-demo", WINDOW_AUTOSIZE);
	// 循环显示视频中的每张图片
	int count = 1;

	for (;;)
	{
		//将视频转给每一张张图进行处理
		capture >> frame;
		//省略对图片的处理
		//视频播放完退出
		if (frame.empty())break;
		imshow("video-demo", frame);

		//拆分视屏为左右两框


		Rect leftRect(0, 0, WIDTH >> 1, HEIGHT);   //创建一个Rect框,属于cv中的类,四个参数代表x,y,width,height
		Rect rightRect(WIDTH >> 1, 0, WIDTH >> 1, HEIGHT);
		//Rect rightRect(WIDTH / 2, 0, WIDTH / 2, HEIGHT);



		frame(leftRect).copyTo(leftImg);
		frame(rightRect).copyTo(rightImg);
		namedWindow("left", WINDOW_AUTOSIZE);
		namedWindow("right", WINDOW_AUTOSIZE);
		imshow("left", leftImg);
		imshow("right", rightImg);


		//按空格键保存当前帧
		if (waitKey(33) == 32)
		{
			static int num = 1;
			String left_img_name, right_img_name;
			left_img_name = "left_" + to_string(num) + ".jpg";
			right_img_name = "right_" + to_string(num) + ".jpg";
			cout << left_img_name << " " << right_img_name << endl;
			num++;
			imwrite("E:\\picture\\stereo_camera\\重建左\\" + left_img_name, leftImg);
			imwrite("E:\\picture\\stereo_camera\\重建右\\" + right_img_name, rightImg);
		}
		//在视频播放期间按键退出
		if (waitKey(25) == 27) break;
	}
	//释放
	capture.release();
	return 0;


OpenCV是一种计算机视觉库,可以用于双目相机测距任务的开发和实现。在Linux操作系统下,我们可以通过以下步骤来进行双目相机测距。 首先,需要连接双目相机并确保它们在Linux系统中被正确识别和配置。可以使用v4l2-ctl等工具来检查相机是否被正确识别,并使用v4l2等工具来设置相机参数(如分辨率、曝光等)。 接下来,我们需要使用OpenCV来获取相机像,并进行双目视觉处理。首先,使用cv::VideoCapture类来打开两个相机的视频流,分别读取左右相机像。 然后,需要对相机像进行预处理,以提高测距的准确性和稳定性。可以使用同一棵树的像校正等方法来消除相机畸变,并使用双目立体匹配算法(如SGBM、BM等)来计算左右相机像之间的视差。 计算视差后,可以使用三角测量方法来根据视差计算出目标点的三维坐标。可以通过将相机的内外参数(如相机焦距、基线等)传递给cv::reprojectImageTo3D函数来实现三维坐标的计算。 最后,我们可以使用计算出的三维坐标来计算目标点之间的距离。可以使用欧氏距离或其他几何距离计算方法来计算两个点之间的空间距离。根据具体需求,还可以进一步优化测距算法或进行深度像的可视化。 总之,OpenCV在Linux系统下提供了丰富的函数和工具,可以方便地实现双目相机测距任务。通过合理的配置和算法选择,我们可以获得准确和稳定的测距结果,用于各种应用场景,如机器人导航、三维重建等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

滑了丝的螺丝钉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值