#python #opencv #opencv4
#python #opencv
Вопрос:
Я пытаюсь выполнить каскадную классификацию, используя CUDA с openCV4.4, однако, когда я запускаю функцию detectMultiScale, это выдает ошибку сегментации. Что я делаю не так?
В python имеется ограниченная документация от OpenCV для CUDA, что затрудняет поиск правильной процедуры для выполнения каскадной классификации с использованием CUDA.
Моя система:
- Quadro P620
- Debian 6.3.0-18
- Python 3.5.3
- Сборка OpenCV 4.5.0 с CUDA = ВКЛЮЧЕНО, CUDNN = ВКЛЮЧЕНО
Код, который я придумал:
vidcap = cv2.VideoCapture('video_file.mp4')
classifier_cuda = cv2.cuda_CascadeClassifier('cascades_file.xml')
while True:
success, frame = vidcap.read()
cuda_frame = cv2.cuda_GpuMat(frame)
result = classifier_cuda.detectMultiScale(cuda_frame)
print (result)
classifier_cuda и cuda_frame соответственно распознаются как <cuda_GpuMat 0x7fffa9446d10> <cuda_CascadeClassifier 0x7fffa9446cf0>
Проблема была решена путем изменения кода на:
classifier_cuda = cv2.cuda.CascadeClassifier_create('model.xml')
while True:
success, frame = vidcap.read()
cuFrame = cv2.cuda_GpuMat(frame)
output2 = cv2.cuda_GpuMat()
output = classifier_cuda.detectMultiScale(cuFrame, output2)
# And then its unclear what to use to get the detections
# I Tried:
final = classifier_cuda.convert(output)
# And:
final = classifier_cuda.convert(output2)
# And:
final = output.download()
# And:
final = output2.download()
Проблема теперь в том, что результат во всех отношениях пустой. Итак, как мне извлечь данные из моего detectmultiscale? Мне нужно иметь список полей привязки [x, y, w, h].
Комментарии:
1. Попробуйте указать полный путь к
CascadeClassifier
подобномуC:User....opencvdatahaarcascadescascade_file.xml
2. попробуйте указать абсолютные пути как для видео, так и для каскадных файлов.
3. Спасибо @Ahmet и Micka, но я уже пробовал, к сожалению, это не сработало
4. Вы получили
cascade_file.xml
из Интернета? У меня такая же проблема, когда я используюçxml
из Интернета. Кажется, что.xml
только из/opencv/data/haarcascades
каталога работает сdetectMultiScale
.5. @Ahmet нет, это пользовательский каскад, пробовал как новый, так и старый макет
Ответ №1:
output.download()
на самом деле работает для меня, но будет None
, если ничего не было обнаружено.
Я думаю, ваша проблема в том, что вам нужно преобразовать фреймы в COLOR_BGR2GRAY
.
Это должно сработать:
source = cv2.VideoCapture('video_file.mp4')
classifier = cv2.cuda.CascadeClassifier_create('model.xml')
while True:
success, frame = source.read()
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
gpu_frame = cv2.cuda_GpuMat(gray_frame)
gpu_result = classifier.detectMultiScale(gpu_frame) # cuda_GpuMat
result = gpu_result.download() # UMat
if result is not None:
for item in result[0]:
(x, y, w, h) = item
print(x, y, w, h)
(OpenCV 4.4)
Комментарии:
1. Я также меняю элемент [0] на элемент, а результат на результат [0], чтобы устранить проблему с одним результатом. Спасибо 🙂
2. Именно то, что я сделал, обновит мой ответ. Tnx!