open cv >>Python3 pasbery pi

open cv >>Python3 pasbery pi
R1
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:18
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 !!

Kopiuj
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, 20:04:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

import cv2
print(cv2.version)
4.5.0

Kopiuj
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
GS
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 9 godzin
  • Postów:1265
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.

RG
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) a to nie tu powinno generować "gray" A crop już dostaje szare?
RG
Może gdzieś "po drodze" wyświetl sobie to "image": cv2.imshow('image',image)
R1
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:18
0

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

face.py

Kopiuj
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)

edytowany 1x, ostatnio: robo1973
Eldorad O.
Sprawdź wymiary obrazka po zrobieniu cropa.
GS
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 9 godzin
  • Postów:1265
1

Jaką wartość ma config.HAAR_FACES w

Kopiuj
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.

R1
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:18
0

HAAR_FACES = 'haarcascade_frontalface_alt.xml'

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

Kopiuj
# 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:624: error: (-2:Unspecified error) Can't initialize GTK backend in function 'cvInitSystem'

Tasmanian Devil
"Twój post prawdopodobnie zawiera niesformatowany kod - nie wklejaj bezpośrednio kodu, ale obejmuj go w odpowiednie znaczniki! (jestem botem, ten komentarz został dodany automatycznie)"
GS
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 9 godzin
  • Postów:1265
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:

Kopiuj
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:

Kopiuj
haar_faces = cv2.CascadeClassifier(config.HAAR_FACES)

nie zadziałało.

AL
Odn. SSH: można wyświetlać okienka lokalnie jeżeli SSH ma włączony X11 forwarding a na komputerze klienckim pracuje Xserver, na Windows np. Xming. Ale to trochę poza konkursem ;)
R1
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:18
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 !!

edytowany 1x, ostatnio: robo1973
GS
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 9 godzin
  • Postów:1265
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:

Kopiuj
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.

R1
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:18
0

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

Kopiuj
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

Kopiuj
$ 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ę ?

GS
Nie bardzo rozumiem co chcesz tu przetestować. Czy użyłeś pełnej ścieżki, czy tylko nazwy pliku jak powyżej? Czy błąd jest ten sam?
R1
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:18
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 ?

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

funkcja

Kopiuj
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
edytowany 1x, ostatnio: robo1973
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)