neozhaoliang / surround-view-system-introduction

A full Python implementation for real car surround view system
MIT License
871 stars 307 forks source link

一个罗技 usb摄像头还有一个笔记本自身的摄像头,能稍微看一下效果吗 #15

Closed beihangzxm closed 3 years ago

beihangzxm commented 3 years ago

运行python run_live_demo.py 后, 显示 Cannot open camera 0 Cannot open camera 2 其中设备号0和2(0是笔记本自身的摄像头,2是罗技 usb摄像头)我是根据以下opencv代码试出来的 import cv2 import numpy as np cv2.namedWindow('testcamera') capture = cv2.VideoCapture(0) #'0'代表从摄像头读入,'./video.avi'代表读入视频 #2代表从usb摄像头读入 capture.isOpened() num = 0 while 1: ret, frame = capture.read() cv2.imshow('testcamera', frame) key = cv2.waitKey(1) num += 1 if key == 1048603: # break

capture.release() cv2.destroyAllWindows()

beihangzxm commented 3 years ago

@neozhaoliang

neozhaoliang commented 3 years ago

你的意思是用自己的代码测试可以打开摄像头,但是运行项目中的代码会报错是吗?、

报告一下你的硬件配置。在运行 run_live_demo.py 时接了几个摄像头。

beihangzxm commented 3 years ago

你的意思是用自己的代码测试可以打开摄像头,但是运行项目中的代码会报错是吗?、

报告一下你的硬件配置。在运行 run_live_demo.py 时接了几个摄像头。 对的。用我那个代码能调取摄像头。硬件是笔记本电脑thinkpad t450,笔记本自身的摄像头,罗技usb摄像头(型号C270),一共这两个摄像头,里面的代码有两行修改为camera_ids = [0,2] flip_methods = [0,2]。另外,我运行run_calibrate_camera.py 的时候也是提示Cannot open camera 0 Cannot open camera 2

neozhaoliang commented 3 years ago

我想问一下你有可以搭载四个摄像头的车可以进行实际开发吗?run_live_demo.py 是不能直接运行的,必须保证你有四个车载摄像头可以传回画面 (或者你有四个同时录制的视频),并且这四个摄像头是经过标定的。

calibrate_camera 这个脚本应该是可以的,你要注意的是昨天更新了一版,加入了指定是否使用 gstreamer 摄像头的选项: https://github.com/neozhaoliang/surround-view-system-introduction/blob/master/run_calibrate_camera.py#L56

默认是使用 gstreamer 的,所以对 usb 摄像头应该加上 --no_gst 选项。你再试试。

rainyfeeling commented 3 years ago

对的。用我那个代码能调取摄像头。硬件是笔记本电脑thinkpad t450,笔记本自身的摄像头,罗技usb摄像头(型号C270),一共这两个摄像头,里面的代码有两行修改为camera_ids = [0,2] flip_methods = [0,2]。另外,我运行run_calibrate_camera.py 的时候也是提示Cannot open camera 0 Cannot open camera 2

最新的代码里有个test_cameras.py程序,可以用来简单做usb摄像头的测试的。它会搜索所有可用的camera device,然后用显示第一个可用摄像头的画面。 你可以按'n'键来切换摄像头。按's'键保存图像。按'q'键退出。

根据我的经验(感觉是在班门弄斧哈 :) )觉得你可能的做法是,

  1. 用test_cameras.py先测试你的几个摄像头可用。我当时在树莓派发现不能接4个usb摄像头。最多只能接上三个。四个一运行v4l driver就会报queue buffer错误。
  2. 然后用--no_gst选项,运行run_calibrate_camera.py进行calibration。(一般只有鱼眼镜头才需要这样做。同时注意做calibration的时候,你的标定板需要占用整个摄像头的大部分画面,否则会在calibration计算时出现一个断言错误,可参考文章: http://ddrv.cn/a/651387。) 如果不是鱼眼的话,还需要关掉鱼眼校正。(在fisheye_camera.py里面修改undistort()函数,直接返回image)
  3. 接下来,需要用标定布来做projection。
    • 首先固定摄像头位置,根据实际情况放置标定布。同时需要修改param_settings.py
    • 然后用test_cameras.py来保存摄像头的图像。以备project之用
    • 运行./get_project_data.sh来更新projection的参数。

对4个摄像头进行step2, step3。完成之后,就应该可以运行run_live_demo.py了。

neozhaoliang commented 3 years ago

如果再优化的话,我想应该一个是用固定的内存数组来存储中间矩阵,而不是临时开辟或者销毁。再一个就是使用查找表直接映射到鸟瞰图里面,而不是每次都校正、透视变换然后拼接。

rainyfeeling commented 3 years ago

再一个就是使用查找表直接映射到鸟瞰图里面,而不是每次都校正、透视变换然后拼接。

查表是不是就是一次性把摄像头里的图像变成最终的样子,而不是重复几次操作。这个表是几步操作合成结果。

neozhaoliang commented 3 years ago

对。一般车载的环视系统都是直接查表合成鸟瞰图,没有中间这些步骤。我当时开发的时候要求是能检测障碍物、车位线并计算位置,那样的话校正、投影这些步骤还是得有,但是中间临时矩阵应该可以在初始化时开辟固定的内存空间。

rainyfeeling commented 3 years ago

这个查找表应该怎么生成呢?看起来不是一个变换矩阵,而是根据每个像素点的位置有不一样的变换。 刚刚随便搜索了一下,没看到相关的介绍。

neozhaoliang commented 3 years ago

我理解应该是两个查找表的合成,一个是校正,一个是投影。校正的表可以直接根据相机参数算出来,投影的表根据标定的射影矩阵也不难算。

视觉SLAM十四讲里面有一个关于鱼眼镜头校正的小例子,其实就是制作查找表的原理。

beihangzxm commented 3 years ago

对的。用我那个代码能调取摄像头。硬件是笔记本电脑thinkpad t450,笔记本自身的摄像头,罗技usb摄像头(型号C270),一共这两个摄像头,里面的代码有两行修改为camera_ids = [0,2] flip_methods = [0,2]。另外,我运行run_calibrate_camera.py 的时候也是提示Cannot open camera 0 Cannot open camera 2

最新的代码里有个test_cameras.py程序,可以用来简单做usb摄像头的测试的。它会搜索所有可用的camera device,然后用显示第一个可用摄像头的画面。 你可以按'n'键来切换摄像头。按's'键保存图像。按'q'键退出。

根据我的经验(感觉是在班门弄斧哈 :) )觉得你可能的做法是,

1. 用test_cameras.py先测试你的几个摄像头可用。我当时在树莓派发现不能接4个usb摄像头。最多只能接上三个。四个一运行v4l driver就会报queue buffer错误。

2. 然后用--no_gst选项,运行run_calibrate_camera.py进行calibration。(一般只有鱼眼镜头才需要这样做。同时注意做calibration的时候,你的标定板需要占用整个摄像头的大部分画面,否则会在calibration计算时出现一个断言错误,可参考文章: [http://ddrv.cn/a/651387。](http://ddrv.cn/a/651387%E3%80%82)) 如果不是鱼眼的话,还需要关掉鱼眼校正。(在fisheye_camera.py里面修改undistort()函数,直接返回image)

3. 接下来,需要用标定布来做projection。

* 首先固定摄像头位置,根据实际情况放置标定布。同时需要修改param_settings.py

* 然后用test_cameras.py来保存摄像头的图像。以备project之用

* 运行./get_project_data.sh来更新projection的参数。

对4个摄像头进行step2, step3。完成之后,就应该可以运行run_live_demo.py了。

你好,get_project_data.sh这个文件在项目里没有啊。。。

beihangzxm commented 3 years ago

对的。用我那个代码能调取摄像头。硬件是笔记本电脑thinkpad t450,笔记本自身的摄像头,罗技usb摄像头(型号C270),一共这两个摄像头,里面的代码有两行修改为camera_ids = [0,2] flip_methods = [0,2]。另外,我运行run_calibrate_camera.py 的时候也是提示Cannot open camera 0 Cannot open camera 2

最新的代码里有个test_cameras.py程序,可以用来简单做usb摄像头的测试的。它会搜索所有可用的camera device,然后用显示第一个可用摄像头的画面。 你可以按'n'键来切换摄像头。按's'键保存图像。按'q'键退出。

根据我的经验(感觉是在班门弄斧哈 :) )觉得你可能的做法是,

1. 用test_cameras.py先测试你的几个摄像头可用。我当时在树莓派发现不能接4个usb摄像头。最多只能接上三个。四个一运行v4l driver就会报queue buffer错误。

2. 然后用--no_gst选项,运行run_calibrate_camera.py进行calibration。(一般只有鱼眼镜头才需要这样做。同时注意做calibration的时候,你的标定板需要占用整个摄像头的大部分画面,否则会在calibration计算时出现一个断言错误,可参考文章: [http://ddrv.cn/a/651387。](http://ddrv.cn/a/651387%E3%80%82)) 如果不是鱼眼的话,还需要关掉鱼眼校正。(在fisheye_camera.py里面修改undistort()函数,直接返回image)

3. 接下来,需要用标定布来做projection。

* 首先固定摄像头位置,根据实际情况放置标定布。同时需要修改param_settings.py

* 然后用test_cameras.py来保存摄像头的图像。以备project之用

* 运行./get_project_data.sh来更新projection的参数。

对4个摄像头进行step2, step3。完成之后,就应该可以运行run_live_demo.py了。

还有,我的笔记本电脑也是3个usb接口的,你现在怎么使用4个usb摄像头的呢?可以微信进一步交流吗?搜:13260363172

beihangzxm commented 3 years ago

@rainyfeeling

rainyfeeling commented 3 years ago

你好,get_project_data.sh这个文件在项目里没有啊。。。

啊哦,sorry, 这个是我自己本地写的脚本,没有push到server上来。所以你是找不到的。

其中的具体内容就是调用run_get_projection_maps.py来对某个摄像头进行映射调整。得到投影矩阵参数。

我把我的get_project_data.sh里面的内容贴出来,你可以根据你的情况修改:

#!/bin/bash

# copy yaml file
cp fisheye_800x600.yaml yaml/front.yaml

# copy png file
cp fisheye_800x600.png images/front.png

python3 run_get_projection_maps.py -camera front -scale 0.8 1 -shift -50 0

# get the projection map data
cp yaml/front.yaml fisheye_800x600_mapped.yaml
rainyfeeling commented 3 years ago

还有,我的笔记本电脑也是3个usb接口的,你现在怎么使用4个usb摄像头的呢?可以微信进一步交流吗?搜:13260363172

用usb hub扩展就可以多接usb摄像头了。

beihangzxm commented 3 years ago

中的具体内容就是调用run_get_projection_maps.py来对某个摄像头进行映射调整。得到投影矩阵参数。

我把我的get_project_data.sh里面的内容贴出来,你可以根据你的情况修改

原作者用的参数是-scale 0.7 0.8 -shift -150 -100,我看你用的是 -scale 0.8 1 -shift -50 0,这里面的scale和shift的参数是根据什么定呢?如果是需要任意赋值尝试的话,达到什么效果才算是理想的效果?

beihangzxm commented 3 years ago

还有,我的笔记本电脑也是3个usb接口的,你现在怎么使用4个usb摄像头的呢?可以微信进一步交流吗?搜:13260363172

用usb hub扩展就可以多接usb摄像头了。

USB摄像头如果接线长度不够的话,可以用USB延长线解决吗?你涉及到这个问题吗? PS:可以微信进一步交流吗?13260363172

rainyfeeling commented 3 years ago

USB摄像头如果接线长度不够的话,可以用USB延长线解决吗?你涉及到这个问题吗? PS:可以微信进一步交流吗?13260363172

可以用延长线的。我用的是2米长的usb camera。关于微信,我也是业余时间才看issue的。一般的问题可以直接在这里公开讨论比较好。

rainyfeeling commented 3 years ago

原作者用的参数是-scale 0.7 0.8 -shift -150 -100,我看你用的是 -scale 0.8 1 -shift -50 0,这里面的scale和shift的参数是根据什么定呢?如果是需要任意赋值尝试的话,达到什么效果才算是理想的效果?

你可以仔细看看作者的文档,写的非常好。 参数的选取,是以你选取的4个点都能在画面显示的范围之中就可以了。

betterpig commented 3 years ago

原作者用的参数是-scale 0.7 0.8 -shift -150 -100,我看你用的是 -scale 0.8 1 -shift -50 0,这里面的scale和shift的参数是根据什么定呢?如果是需要任意赋值尝试的话,达到什么效果才算是理想的效果?

你可以仔细看看作者的文档,写的非常好。 参数的选取,是以你选取的4个点都能在画面显示的范围之中就可以了。

老哥,你买的视角是多少度的,焦距是多少。我买的180度左右两侧刚好覆盖标定布多一点,导致鸟瞰变换后看不到角落。

neozhaoliang commented 2 years ago

@beihangzxm @rainyfeeling 请问二位是否使用此项目成功部署在实车运行了?成功的话介意分享一下效果图,我好在 readme 中作为用户案例引用?