Я пытаюсь реализовать код для обнаружения лиц в газетных статьях. Итак, я запустил этот фрагмент кода, и он несколько сработал (оказалось, что и некоторые ложные ошибки):
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, но все еще та же ошибка. Что здесь происходит?