我正在使用PointGrey的CMLN-13S2M-CS
相机。此相机具有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 Pixel格式。我做错了什么?
答案 0 :(得分:3)
这是一个快速演示,演示如何将uint8
的1D数组转换为uint16
的2D数组。我们需要的关键功能是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 here中阅读有关字节排序的内容。
如果 仍然看起来不正确,那么数据可以被组织为两个平面,其中一个平面用于像素的低位,另一个平面用于高 - 订单位。这也很容易处理,但希望它不会那样。 ;)