远程天文台用摄像头的目的:
- 捕获流星视频
- 拍星空延时
- 查看望远镜当前姿态
对摄像头的要求:
- 不能有可见光补光、也不能有红外补光。会对天文摄影造成干扰
- 耐低温、不凝结。台址在华北以北,冬季气温低
- 有软件控制的云台
- 支持RTSP视频流
- 越高清越好,视角不宜过广,否则看不清星星
2021年底,我试过IMX291、海康威视C8W、小蚁摄都有各种各样的问题,最终选择了海康威视臻全彩DS-2CD3T87WD-L 4mm焦距(正考虑换2.8mm的),这是一款800万像素的低照度全彩摄像头,可在没有任何补光的情况下可以拍出彩色的画面,照度低至0.0005,关于它的详细参数见官网,营销信息参考淘宝 。
海康威视臻全彩DS-2CD3T87WD-L大部分情况下都是接硬盘录像机使用,与日常使用的USB摄像头不同,网络摄像头不能被常见软件直接识别调用,需要将网络摄像头模拟为本地摄像头。
云台使用的是https://item.taobao.com/item.htm?id=593470869933 看上去使用的是Modbus TCP/IP控制,没空研究了,用自带的软件凑合用
海康威视臻全彩网络摄像头模拟成本地摄像头
- 将海康威视臻全彩DS-2CD3T87WD-L接通在局域网内,保证和电脑在同一局域网内;
- 下载安装Hikvision Tools(原名SADPTool) 找到局域网内摄像头的IP
- 通过浏览器访问摄像头IP,比如我的是10.0.0.10,输入默认管理员用户名密码admin,进入摄像头自己的管理界面,首次使用需要激活,根据提示进行
- 大部分采用默认设置即可,场景改为低照度这样就关闭了补光,码率改为定码率,帧率调到最高;关闭OSD水印或设置一个酷酷的名字;NTP时间服务使用阿里云的ntp.aliyun.com;为了获得更好的清晰度,后面所使用的都是RTSP主码流
- 电脑上按照顺序下载并安装
- OBS
- OBS-Virtualcam插件
- GStreamer(MinGW 64-bit runtime installer),安装Gstreamer后,将
d:\gstreamer\1.0\x86_64\bin
添加到环境变量path下(添加环境变量的方法),d:\gstreamer是你的安装路径。 - OBS-Gstreamer插件,解压后将
obs-gstreamer
复制到C:\Program Files\obs-studio\obs-plugins\64bit
下。如果地址打不开就访问链接:https://pan.baidu.com/s/1UghiVq1GqpcMZsCFDvXoPA 提取码:1111
- 用VLC播放器测试网络摄像头的RTSP协议,海康威视的RTSP输出流地址格式是:
rtsp://admin:摄像头密码@摄像头IP地址:554/h264/ch1/main/av_stream
,输入到VLC中进行播放测试,看到实时画面说明摄像头设置完成 - 打开OBS软件,在视频源中添加并选择GStreamer Source
- 在弹出的窗口中,Pipeline一项将rtsp地址替换为自己的,如:
rtspsrc location="rtsp://admin:xxxxxx@10.0.0.10:554/h264/ch1/main/av_stream" latency=0 buffer-mode=auto ! rtph264depay ! h264parse ! d3d11h264dec ! video.
注意不要有换行。 - 设置好后,在工具菜单-启用虚拟摄像头即可,Target Camera就是虚拟出来本地摄像头的名字。OBS软件不要关。
流星捕获和延时拍摄
流星捕获使用的软件是UFocaptureHD,可以看到刚才虚拟出来的摄像头了
参考星空π对Terry老师的文章《UFOCaptureHD2 快速指南》 http://pi.bestxtech.com/ufocapture/index/
延时拍摄可以使用ffmpeg或者python+opencv通过摄像头的rtsp协议获取图像截图保存,例如代码:
import cv2
def get_img_from_camera_net(folder_path):
cap = cv2.VideoCapture("rtsp://xxxxx/ch1/stream1")#获取网络摄像机
i = 1
while i<3:
ret, frame = cap.read()
cv2.imshow("capture", frame)
print (str(i))
cv2.imwrite(folder_path + str(i) + '.jpg', frame)# 存储为图像
if cv2.waitKey(1) & 0xFF == ord('q'):
break
i += 1
cap.release()
cv2.destroyAllWindows()
# 测试
if __name__ == '__main__':
folder_path = 'D:\Anacon\\'
get_img_from_camera_net(folder_path)
星友评论