Próbuję uruchomić prosty plik .py z filmem przechwytującym kod ze skryptu powłoki. W tym celu użyłem zwykłego OpenCV. Teraz nazywam to .py ze skryptu powłoki. Kiedy wykonuję skrypt powłoki ze zintegrowanego terminala w VSCode, działa dobrze. Ale kiedy ten sam plik .py jest wykonywany z terminala, tj. Poza VSCode, wyrzuca to w terminalu:

Kod wyniku XmbTextListToTextProperty -2

I kończy wykonywanie (tj. przechwytuje klatki z kamery internetowej) pomimo tego, że pojawia się na terminalu

Test1.py to plik .py, który zawiera kod cv2 i odczytuje ramkę z kamery internetowej:

import cv2
img = None
vid = cv2.VideoCapture(0)
while True:
    _, img = vid.read()
    cv2.imshow("Frame", cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    if cv2.waitKey(5) & 0xFF == ord('y'):
        break
vid.release()
cv2.destroyAllWindows()  

Test.sh to skrypt powłoki, którego używam

#!/bin/bash
eval "$(conda shell.bash hook)"
conda activate facenet
python3 ./test1.py

Po wykonaniu testu.sh w Terminalu (tj. Poza zintegrowanym terminalem w VSCode):

(base) pranjal@pranjal99:~/Projects/WhosThere$ ./test.sh 
XmbTextListToTextProperty result code -2
XmbTextListToTextProperty result code -2
XmbTextListToTextProperty result code -2
(base) pranjal@pranjal99:~/Projects/WhosThere$ 

UWAGA : Pomimo tych błędów pojawiających się w terminalu, kod jest wykonywany poprawnie. Ponadto, po uruchomieniu w zintegrowanym terminalu w VSCode, działa dobrze, tj. NIE zgłasza tych błędów

Po wielu próbach doszedłem do wniosku, że ta anomalia jest spowodowana linią, chociaż nie mam najmniejszego pojęcia, dlaczego

cv2.imshow("Frame", cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

Po usunięciu tej linii takie błędy nie pojawiają się w terminalu.

EDYTUJ: Po wydrukowaniu przeczytanego kształtu ramki otrzymujemy w terminalu (poza zintegrowanym terminalem VSCode):

(480, 640, 3)
XmbTextListToTextProperty result code -2
XmbTextListToTextProperty result code -2
XmbTextListToTextProperty result code -2
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)
(480, 640, 3)

Byłoby naprawdę pomocne, gdyby ktoś poprowadził mnie we właściwym kierunku, aby rozwiązać te dziwne błędy.

1
pranjaldatta 18 grudzień 2019, 01:57
Nie obsługujesz warunku, gdy twój obiekt vid ma ramki ni do odczytania. Sprawdź, czy ramka została odczytana i dopiero wtedy ją wyświetl.
 – 
Shubham Jaiswal
18 grudzień 2019, 04:57
Próbowałem dodając if ret == True: cv2.imshow("Frame", cv2.cvtColor(img, cv2.COLOR_BGR2RGB)). Ale niestety to nie zadziałało. Ten sam błąd. Proszę mnie poprawić, jeśli zrobiłem coś niepoprawnie z twoją sugestią
 – 
pranjaldatta
18 grudzień 2019, 10:44
Czy możesz spróbować tego: cv2.VideoCapture(0, cv2.CAP_V4L)
 – 
Shubham Jaiswal
18 grudzień 2019, 14:07
Przepraszam. Brak szczęścia.
 – 
pranjaldatta
18 grudzień 2019, 18:10
Czy możesz potwierdzić, że poprawnie odczytujesz ramki, drukując wymiary obrazu przed wywołaniem cv2.imshow().
 – 
Shubham Jaiswal
18 grudzień 2019, 20:06

1 odpowiedź

Nie mogę komentować, więc piszę tutaj. Czy to z powodu lokalizacji? Może możesz wpisać locale na swoim terminalu i zobaczyć, jaki jest ustawiony LANG. Spróbuj zmienić to na inne i zobacz.

Miałem podobny problem i rozwiązałem go, zmieniając wartość LANG z „en-IN” na „en_US.utf8”, a następnie ponownie uruchamiając.

Możesz użyć tego polecenia, aby go zaktualizować:

sudo update-locale LANG=name_of_locale_here
0
cliff 29 styczeń 2020, 14:38