Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert PyQt5 QPixmap to numpy ndarray

I have pixmap:

pixmap = self._screen.grabWindow(0,
                                 self._x, self._y,
                                 self._width, self._height)

I want to convert it to OpenCV format. I tried to convert it to numpy.ndarray as described here but I got error sip.voidptr object has an unknown size

Is there any way to get numpy array (same format as cv2.VideoCapture read method returns)?

like image 596
ingvar Avatar asked Jul 10 '17 20:07

ingvar


2 Answers

I got numpy array using this code:

channels_count = 4
pixmap = self._screen.grabWindow(0, self._x, self._y, self._width, self._height)
image = pixmap.toImage()
s = image.bits().asstring(self._width * self._height * channels_count)
arr = np.fromstring(s, dtype=np.uint8).reshape((self._height, self._width, channels_count)) 
like image 85
ingvar Avatar answered Sep 30 '22 09:09

ingvar


The copy can be avoided by doing:

channels_count = 4
pixmap = self._screen.grabWindow(0, self._x, self._y, self._width, self._height)
image = pixmap.toImage()
b = image.bits()
# sip.voidptr must know size to support python buffer interface
b.setsize(self._height * self._width * channels_count)
arr = np.frombuffer(b, np.uint8).reshape((self._height, self._width, channels_count))
like image 26
Stefan Avatar answered Sep 30 '22 10:09

Stefan