PyImageSearch / imutils

A series of convenience functions to make basic image processing operations such as translation, rotation, resizing, skeletonization, and displaying Matplotlib images easier with OpenCV and Python.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

wrong datatype for eyesCenter in facealiner

andvikt opened this issue · comments

>   	M = cv2.getRotationMatrix2D(eyesCenter, angle, scale)
E    TypeError: Can't parse 'center'. Sequence item with index 0 has a wrong type

the actual shape of eyesCenter is (np.int64, np.int64), but must be (int, int)
it can be easyly fixed by [int(x) for x in eyesCenter]

I will provide PR fixing that

Wow that's something why i can't fix this bug whenever i search on google. I think im gonna use haar cascade if this issue doesn't solve yet

Hey folks,

Thanks for the issue. Could you give us a reproducible bug to check? A colab notebook with the bug would do! TIA 😄

I can confirm that this is still an issue. I was following the face align tutorial, and kept running into this exact issue. I eventually added all of the facealigner.py code into my code and got the same error. Adding int() to the tuple fixed it:

eyesCenter = (int((leftEyeCenter[0] + rightEyeCenter[0]) // 2),
        int((leftEyeCenter[1] + rightEyeCenter[1]) // 2))

Maybe I'm using a bad version? This is what my pip reports:

Package               Version
--------------------- --------
cmake                 3.22.3
dlib                  19.23.1
imutils               0.5.4
numpy                 1.22.3
opencv-contrib-python 4.5.5.64

Hi @ariG23498 this is still an issue as I got a ticket from a customer today about this

Tagging @abhishekthanki and @ritwikraha to this issue!

I had this issue too with opencv-python 4.6.0.66 and numpy 1.19.5. Thanks @AKSoapy29 for the easy fix.

det = dlib.get_frontal_face_detector()
pred = dlib.shape_predictor(r'...\shape_predictor_68_face_landmarks.dat')
alg = FaceAligner(pred, desiredFaceWidth = 256)
This tries to do face-normalisation

This makes this error 'Can't parse 'Center''

frame = cv2.imread('img.jpg')
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
rect = detector(gray,1)[0]
faceAligned = aligner.align(frame, gray, rect)

File ~\AppData\Local\Programs\Python\Python310\lib\site-packages\imutils\face_utils\facealigner.py:68, in FaceAligner.align(self, image, gray, rect)
64 eyesCenter = ((leftEyeCenter[0] + rightEyeCenter[0]) // 2,
65 (leftEyeCenter[1] + rightEyeCenter[1]) // 2)
67 # grab the rotation matrix for rotating and scaling the face
---> 68 M = cv2.getRotationMatrix2D(eyesCenter, angle, scale)
70 # update the translation component of the matrix
71 tX = self.desiredFaceWidth * 0.5

TypeError: Can't parse 'center'. Sequence item with index 0 has a wrong type

For me, casting the eyesCenter from <class 'numpy.int64> to type <class 'int'> instead of fixed it:

in faceAligner.py:64 I did:

eyesCenter = (int((leftEyeCenter[0] + rightEyeCenter[0]) // 2),
		int((leftEyeCenter[1] + rightEyeCenter[1]) // 2))

For me, casting the eyesCenter from <class 'numpy.int64> to type <class 'int'> instead of fixed it:

in faceAligner.py:64 I did:

eyesCenter = (int((leftEyeCenter[0] + rightEyeCenter[0]) // 2),
		int((leftEyeCenter[1] + rightEyeCenter[1]) // 2))

This works for me! Thanks @dunland