I am using a CM3 which interfaces with the OV9281 using a custom carrier board.
I have a python script based heavily off of the capture2opencv.py demo - it sits in a while loop capturing images.
I have set my gpu allocation as following:
pi@raspberrypi:~ $ vcgencmd get_mem gpu gpu=128M <code></code>
My wiring is a little bit different to a standard CM3 carrier so I have reflected this change in my setup:
`
self._camera = arducam.mipi_camera()
define hw wiring for OV9281
self.camera_interface = arducam.CAMERA_INTERFACE()
self.camera_interface.i2c_bus = 0
self.camera_interface.camera_num = 1
self.camera_interface.sda_pins = (28, 0)
self.camera_interface.led_pins = (44, 5)
self.camera_interface.shutdown_pins = (44,5)
self._camera.init_camera2(self.camera_interface)
self._fmt = self._camera.set_resolution(640, 400)
self._camera.software_auto_exposure(enable = True)
`
My main loop is pretty much identical to capture2opencv.py:
`
while True:
update frame
frame = self._camera.capture(encoding = ‘i420’)
height = int(self.align_up(fmt[‘height’], 16))
width = int(self.align_up(fmt[‘width’], 32))
image = frame.as_array.reshape(int(height * 1.5), width)
image = cv2.cvtColor(image, cv2.COLOR_YUV2BGR_I420)
`
My problem is that after 50 or so images, the arducam_capture() method will timeout and return a NullPtr. (Definition located here)
My current work around is the very hacky following to catch the buffer being a Null Pointer. It will just reinitialise the camera again and it will operate normatlly for another ~50 images before the error occurs again.
try: image = frame.as_array.reshape(int(height * 1.5), width) except ValueError as e: print("ValueError: {}".format(e)) self._camera.close_camera() self._camera.init_camera2(self.camera_interface) continue <code></code>
I have been using this camera with a 3B+ for several weeks and haven’t had this problem.
(Also posted on git repo: https://github.com/ArduCAM/MIPI_Camera/issues/24)