Распознавание лиц OpenCV обнаруживает проблему MultiScale - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь реализовать код для обнаружения лиц в газетных статьях. Итак, я запустил этот фрагмент кода, и он несколько сработал (оказалось, что и некоторые ложные ошибки):

test_img = imgs["a-0.png"].copy()
opencvImage = cv.cvtColor(np.array(test_img), cv.COLOR_RGB2GRAY)
test_img1 = opencvImage.copy()
thresh, cv_img_bin=cv.threshold(test_img1,180,255,cv.THRESH_BINARY)
cv_img_bin.tolist()
faces = face_cascade.detectMultiScale(cv_img_bin, scaleFactor = 1.20, minNeighbors = 2, minSize=(80,80))
drawing=ImageDraw.Draw(test_img0) # creates a drawing object
for x,y,w,h in faces:
    drawing.rectangle((x,y,x+w,y+h), outline="red", width=4)
display(test_img0)

Это сработало, но было много ложных срабатываний / отрицаний, и хотя я немного играл с параметрами detectMultiscale я все еще не мог найти подходящего совпадения. Поэтому я попытался запустить несколько циклов for, чтобы увидеть, дает ли какая-либо комбинация точное количество совпадений (просто численно - если определенная комбинация может найти ровно 9 лиц). Я пробовал этот фрагмент кода:

test_img1 = opencvImage.copy()
for thr in range(100,240,10):
    thresh, cv_img_bin = cv.threshold(test_img1, thr, 255, cv.THRESH_BINARY)   
    cv_img_bin.tolist()
    for scaleFac in [1,1.05,1.1,1.15,1.20,1.25,1.30]:
        for minNeigh in [1,2,3,4,5,6,7,8,9,10]:
            for w in [30,40,50,60,70,80,90,100,110]:
                faces = face_cascade.detectMultiScale(cv_img_bin, scaleFactor = scaleFac, minNeighbors = minNeigh, minSize =(w,w))
                if len(faces) == 9:
                     print: """Threshold: {}
                            scaleFactor:{}
                            minNeighbours{}:
                            width:{}""".format(thr, scaleFac, minNeigh, w)

Он не работает, выдает ошибку:

error: OpenCV(4.2.0) ..\modules\objdetect\src\cascadedetect.cpp:1389: error: (-215:Assertion failed) scaleFactor > 1 && _image.depth() == CV_8U in function 'cv::CascadeClassifierImpl::detectMultiScale'

Я не могу понять, почему, мне кажется, что это то же самое кусочки кода, который работал выше. Я попытался настроить циклы for, но все еще та же ошибка. Что здесь происходит?

...