open cv >>Python3 pasbery pi

0

Witam !!

Zainstalowałem opencv : https://qabrio.pl/rozpoznawanie-ekranu-3-opencv/

Uruchamiam program poniżej i mam taki błędy
Proszę o pomoc Pozdrawiam !!

Capturing image...
imwrite_('capture.pgm'): can't write data: OpenCV(4.5.0) /home/pi/opencv/modules/imgcodecs/src/grfmt_pxm.cpp:427: error: (-5:Bad argument) Portable bitmap(.pgm) expects gray image in function 'write'

Traceback (most recent call last):
  File "capture-positives.py", line 58, in <module>
    result = face.detect_single(image)
  File "/home/pi/face.py", line 23, in detect_single
    flags=cv2.CASCADE_SCALE_IMAGE)
cv2.error: OpenCV(4.5.0) /home/pi/opencv/modules/objdetect/src/cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'detectMultiScale'

Python 3.7.3 (default, Jan 22 2021, 2044)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

import cv2
print(cv2.version)
4.5.0

import glob
import os
import sys
import select

import cv2

import hardware
import config
import face


# Prefix for positive training image filenames.
POSITIVE_FILE_PREFIX = '/training/positive_'


def is_letter_input(letter):
	# Utility function to check if a specific character is available on stdin.
	# Comparison is case insensitive.
	if select.select([sys.stdin,],[],[],0.0)[0]:
		input_char = sys.stdin.read(1)
		return input_char.lower() == letter.lower()
	return False


if __name__ == '__main__':
	camera = config.get_camera()
	#box = hardware.Box()
	# Create the directory for positive training images if it doesn't exist.
	if not os.path.exists(config.POSITIVE_DIR):
		os.makedirs(config.POSITIVE_DIR)
	# Find the largest ID of existing positive images.
	# Start new images after this ID value.
	files = sorted(glob.glob(os.path.join(config.POSITIVE_DIR, 
		POSITIVE_FILE_PREFIX + '[0-9][0-9][0-9].pgm')))
	count = 0
	if len(files) > 0:
		# Grab the count from the last filename.
		count = int(files[-1][-7:-4])+1
	print ("Capturing positive training images.")
	print ("Press button or type c (and press enter) to capture an image.")
	print ("Press Ctrl-C to quit.")
	while True:
		# Check if button was pressed or 'c' was received, then capture image.
		if is_letter_input('c'):
        
			print ("Capturing image...")
			image = camera.read()
			# Convert image to grayscale.
			image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
			# Get coordinates of single face in captured image.
			result = face.detect_single(image)
			if result is None:
				print ("Could not detect single face!  Check the image in capture.pgm \
					  to see what was captured and try again with only one face visible.")
				continue
			x, y, w, h = result
			# Crop image as close as possible to desired face aspect ratio.
			# Might be smaller if face is near edge of image.
			crop = face.crop(image, x, y, w, h)
			# Save image to file.
			filename = os.path.join(config.POSITIVE_DIR, POSITIVE_FILE_PREFIX + '%03d.pgm' % count)
			cv2.imwrite(filename, crop)
			print ("Found face and wrote training image"), filename
			count += 1
1

Daj namiary na tę bibliotekę "face". Wygląda na to, że metoda crop() zwraca coś, co nie jest 8-bitową mapą szarości akceptowaną przez PGM.

0

cv2.imshow(window_name, image)
cv2.error: OpenCV(4.5.0) /home/pi/opencv/modules/highgui/src/window_gtk.cpp error: (-2:Unspecified error) Can't initialize GTK backend in function 'cvInitSystem'

face.py

import cv2

import config


haar_faces = cv2.CascadeClassifier(config.HAAR_FACES)


def detect_single(image):
	"""Return bounds (x, y, width, height) of detected face in grayscale image.
	   If no face or more than one face are detected, None is returned.
	"""
	faces = haar_faces.detectMultiScale(image, 
				scaleFactor=config.HAAR_SCALE_FACTOR, 
				minNeighbors=config.HAAR_MIN_NEIGHBORS, 
				minSize=config.HAAR_MIN_SIZE, 
				flags=cv2.CASCADE_SCALE_IMAGE)
	if len(faces) != 1:
		return None
	return faces[0]

def crop(image, x, y, w, h):
	"""Crop box defined by x, y (upper left corner) and w, h (width and height)
	to an image with the same aspect ratio as the face training data.  Might
	return a smaller crop if the box is near the edge of the image.
	"""
	crop_height = int((config.FACE_HEIGHT / float(config.FACE_WIDTH)) * w)
	midy = y + h/2
	y1 = max(0, midy-crop_height/2)
	y2 = min(image.shape[0]-1, midy+crop_height/2)
	return image[y1:y2, x:x+w]

def resize(image):
	"""Resize a face image to the proper size for training and detection.
	"""
	return cv2.resize(image, 
					  (config.FACE_WIDTH, config.FACE_HEIGHT), 
					  interpolation=cv2.INTER_LANCZOS4)

1

Jaką wartość ma config.HAAR_FACES w

haar_faces = cv2.CascadeClassifier(config.HAAR_FACES)

Wygląda na to, że nie masz poprawnie zainicjalizowanego obiektu CascadeClassifier. Konstruktor tego obiektu oczekuje ścieżki do pliku XML zawierającego model. Patrząc np. na ten kod:
https://github.com/normyx/MMM-Facial-Recognition-OCV3/blob/master/lib/common/commonconfig.py
za HAAR_FACES kryje się ścieżka do pliku. Sprawdź jej wartość i czy masz ten plik. Kod z którego korzystasz był pisany pod OpenCV 3, a widzę że masz zainstalowane OpenCV 4, wiec może nie być kompatybilności wstecznej.

0

HAAR_FACES = 'haarcascade_frontalface_alt.xml'

bardziej mam coś w systemie
Uruchamiam inny przykładowy program

# Python program to explain cv2.imshow() method

# importing cv2
import cv2

# path
path = r'Pictures/robert.jpg'

# Reading an image in default mode
image = cv2.imread(path)

# Window name in which image is displayed
window_name = 'image'

# Using cv2.imshow() method
# Displaying the image
cv2.imshow(window_name, image)

#waits for user to press any key
#(this is necessary to avoid Python kernel form crashing)
cv2.waitKey(0)

#closing all open windows
cv2.destroyAllWindows()

pi@raspberrypi:~ $ python3 wyswietl_zdjecie.py
Unable to init server: Could not connect: Connection refused
Traceback (most recent call last):
File "wyswietl_zdjecie.py", line 17, in <module>
cv2.imshow(window_name, image)
cv2.error: OpenCV(4.5.0) /home/pi/opencv/modules/highgui/src/window_gtk.cpp error: (-2:Unspecified error) Can't initialize GTK backend in function 'cvInitSystem'

0

@robo1973:
To, że nie działa Ci cv2.imshow() to inny problem. Jesteś na Raspberry Pi, w jaki sposób się z nim łączysz? SSH, VNC, czy pracujesz bezpośrednio? Jeśli pracujesz wyłącznie w trybie konsolowym, no to chyba nie będziesz mógł wyświetlać okienek.
Problem z imshow na razie odpuść, skup się na działaniu programu. Sprawdź czy masz w systemie plik 'haarcascade_frontalface_alt.xml' - jeśli nie, to po prostu brakuje Ci modelu potrzebnego do zainicjalizowania obiektu. Jeśli masz, to spróbuj jako parametr podać ścieżkę do tego pliku. Zauważ, że program wywalił Ci się na:

cv2.error: OpenCV(4.5.0) /home/pi/opencv/modules/objdetect/src/cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'detectMultiScale'

czyli tu:
https://github.com/opencv/opencv/blob/master/modules/objdetect/src/cascadedetect.cpp#L1689

a definicja metody empty()
https://github.com/opencv/opencv/blob/master/modules/objdetect/src/cascadedetect.cpp#L1619
wskazuje, że cc (czyli implementacja idiomu Pimpl) jest pusta, czyli:

haar_faces = cv2.CascadeClassifier(config.HAAR_FACES)

nie zadziałało.

0

Wiec tak po kolei cv2.imshow() działa jak uruchomię program na na RP jak połączę się VNC i wtedy z konsoli >>python3 capture-positives.py

Plik 'haarcascade_frontalface_alt.xml' mam i jest w lokalizacji /home/pi/opencv/data/haarcascades
Co mam z tą lokalizacją zrobić bo nie bardo zrozumiałem ?
pozdrawiam !!

0
robo1973 napisał(a):

Plik 'haarcascade_frontalface_alt.xml' mam i jest w lokalizacji /home/pi/opencv/data/haarcascades
Co mam z tą lokalizacją zrobić bo nie bardo zrozumiałem ?

W pierwszej kolejności spróbuj stworzyć CascadeClassifier w taki sposób:

haar_faces = cv2.CascadeClassifier('/home/pi/opencv/data/haarcascades/haarcascade_frontalface_alt.xml')

Jeśli to zadziała, to trzeba jakoś skleić Twoje config.HAAR_FACES (czyli nazwę pliku) ze ścieżką, w której ten plik jest.

0

nie zadziałało
napisałem program do testu

import numpy as np
import cv2

eye_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')

print(cv2.data.haarcascades)
print("aaaaa")
image = np.array([1,2,3], dtype='uint8')
eye_cascade.detectMultiScale(img, 1.3, 5)

wynik

$ python3 test.py
Traceback (most recent call last):
  File "test.py", line 6, in <module>
    print(cv2.data.haarcascades)
AttributeError: module 'cv2' has no attribute 'data'

print(cv2.data.haarcascades) powinno wyrzucić ścieżkę ?

0

Udało się uruchomić wykrywanie twarzy Problem był że nie mogłem pobrać zdjęcie a z kamery w formacie .png tylko w .jpg
Zapis do pliku działa w .npg

Mam jeszcze błąd poniżej ?

in is_letter_input
    if  select.select([sys.stdin,],[],[],0.0)[0]:

funkcja

def is_letter_input(letter):
	# Utility function to check if a specific character is available on stdin.
	# Comparison is case insensitive.
	if  select.select([sys.stdin,],[],[],0.0)[0]:
		input_char = sys.stdin.read(1)
		return input_char.lower() == letter.lower()
	return False

1 użytkowników online, w tym zalogowanych: 0, gości: 1