如何使用Python读取尼康D5600相机中的图像文件
如果我有遗漏内容或者不符合格式规范的地方请见谅,这是我首次在这类论坛发帖。
我目前将尼康D5600用于一个极其基础的图像分析方案中,希望无需每次运行测试都手动传输文件就能直接调用相机内的图像,但我在文件访问环节遇到了问题。
需要明确的是,我并不想捕获视频流的截图;我知道这一方案可行,但视频模式下的分辨率会低1/3左右,无法满足我的应用需求。
最开始我将相机通过USB连接到我的Windows 10台式机,尝试用Windows属性页给出的文件路径(我替换了路径中的斜杠)调用图像:img = cv2.imread("This PC/D5600/Removable storage/DCIM/314D5600/CFW_0031.jpg")
但这一操作没有成功。
我将该图片复制到其他磁盘后测试了调用命令,确认命令本身没有问题:img = cv2.imread("D:/CFW_0031.jpg")
这一次调用成功。
我推测问题大概率出在路径中的“This PC”部分,我读过一些2009年左右关于MTP等协议的旧帖,但我不确定这款相机是否使用该协议,也不知道如果适用该协议的话要如何入手操作。
我也尝试过使用pygrabber(我认为它是direct show的封装,可能我的术语表述有误)通过Python控制相机,但是也没有成功,不过有意思的是我成功控制了我的电脑摄像头。
最后我尝试按照为USB连接的数码相机分配盘符的方法操作,但发现磁盘管理器的磁盘列表中没有该相机,也有可能是我操作错了,但我没找到问题出在哪里。
针对Cristoph的评论补充
- 我只需要能在Python中使用这些图像文件即可,一般是用opencv,我想这应该属于读取文件的范畴?
- 我附上了文件资源管理器中“This PC”页面的截图,相机在设备和驱动器分类下显示,但没有分配盘符。
解决方案
你遇到的问题核心是尼康D5600默认通过MTP(媒体传输协议)和电脑连接,这类协议下的设备不会被系统识别为普通块存储设备,没有盘符,所以常规的文件路径访问方式无效,按优先级给你三个可行方案:
方案1:修改相机USB连接模式(最省事)
直接在尼康D5600的设置菜单中找到「USB连接选项」,将默认的MTP/PTP模式改为「大容量存储(MSC)」模式,修改后重新连接电脑,相机会被识别为普通U盘,自动分配盘符,直接用对应盘符下的文件路径调用cv2.imread即可正常读取。
方案2:使用MTP协议适配的Python库读取
如果不想修改相机设置,可以直接调用支持MTP协议的Python库直接读取文件内容到内存,无需落地到本地磁盘:
- 先安装依赖库:
pip install pymtp numpy opencv-python - 参考代码示例:
import cv2 import numpy as np from pymtp import MTP # 初始化并连接MTP设备 mtp_dev = MTP() mtp_dev.connect() # 遍历设备内所有文件匹配目标 target = None for file in mtp_dev.get_filelisting(): if file.filename == "CFW_0031.jpg": target = file break if target: # 读取文件内容到内存 file_buf = mtp_dev.get_file_to_pointer(target.item_id, target.filesize) # 转换为OpenCV可用的图像格式 img_arr = np.frombuffer(file_buf.read(), np.uint8) img = cv2.imdecode(img_arr, cv2.IMREAD_COLOR) # 后续正常处理图像即可 print("图像读取成功,尺寸:", img.shape) # 断开设备连接 mtp_dev.disconnect()
方案3:工具映射MTP设备为盘符
可以使用轻量工具MTPdrive将MTP协议的相机临时映射为本地盘符,映射完成后直接用常规路径读取即可,无需修改相机设置也不用改代码。
注意事项
- 所有操作前确保相机处于开机状态,USB连接稳定,没有被其他程序占用
- 如果使用pymtp时出现设备识别失败的问题,可以先安装尼康官方的PC端驱动后再重试
内容的提问来源于stack exchange,提问作者derekburm

