python - 使用 PyCapture2 读取 MONO 16 位图像
问题描述
我正在使用CMLN-13S2M-CS
PointGrey 的相机。该相机具有 MONO 16 位像素格式。使用 PointGrey 的PyCapture2
包装器我无法检索相机正在记录的图像。
我有以下代码:
import sys
import numpy
import PyCapture2
## Connect camera
bus = PyCapture2.BusManager()
c = PyCapture2.Camera()
c.connect(bus.getCameraFromIndex(0))
## Configure camera format7 settings
fmt7imgSet = PyCapture2.Format7ImageSettings(0, 0, 0, 1296, 964, PyCapture2.PIXEL_FORMAT.MONO16)
fmt7pktInf, isValid = c.validateFormat7Settings(fmt7imgSet)
c.setFormat7ConfigurationPacket(fmt7pktInf.recommendedBytesPerPacket, fmt7imgSet)
## Start capture and retrieve buffer
c.startCapture()
im = c.retrieveBuffer()
print im.getData().shape
print numpy.max(im.getData())
print
语句返回以下内容:(2498688,)
和240
。形状正是2 x (964 x 1296)
。我应该如何重塑这个?此外,饱和时的最大值为255
。这很奇怪,因为这对应于 MONO 8 像素格式。我究竟做错了什么?
解决方案
这是一个快速演示,展示了如何将 1D 数组转换uint8
为uint16
. 我们这里需要的关键函数是view
.
import numpy as np
# Make 24 bytes of fake data
raw = np.arange(24, dtype=np.uint8)
#Convert
out = raw.view(np.uint16).reshape(3, 4)
print(out)
print(out.dtype)
输出
[[ 256 770 1284 1798]
[2312 2826 3340 3854]
[4368 4882 5396 5910]]
uint16
感谢 Andras Deak 的帮助!
如果生成的图像看起来不正确,您可能需要交换 16 位整数的字节顺序。您可以在此处阅读 Numpy 中的字节排序。
如果这看起来仍然不正确,那么数据可能会被组织为两个平面,一个平面用于像素的低位,另一个平面用于高位。这也很容易处理,但希望不会出现这种情况。;)
推荐阅读
- django - 如何创建具有 2 个外键的好友对象?
- apache-kafka - 使用 Spring Cloud streamng 无法在 Kafka Ktable 中看到任何消息
- markdown - 在 R Markdown 中转义正斜杠
- reactjs - 如何通过反应钩子在功能组件中使用componentWillUpdate?
- laravel - 作曲家需要 laravel/ui 不工作
- android - Android 在选项卡中的多个片段之间切换
- java - 在特定列中插入选择
- java - ITEXT 7.0.4 应用程序在数据长度增加时进入无限循环
- java - 将文件上传到 Google Drive 中的特定文件夹
- c# - 方法同时执行