Zaimportowałem cv2 jako cv, utworzyłem listę flag progów, połączono „cv”. z flagami, a następnie utworzył pętlę for do przekazywania flag jako argumentów. Ale Python pokazuje TypeError. Załączam obraz wyjścia. Prosimy o pomoc w utworzeniu wszystkich możliwych progów za pomocą pętli lub w inny sposób, z wyjątkiem wyraźnego wymieniania flag za każdym razem.

[Wyjście kodu - Jupyter]

0
Fu678 31 marzec 2020, 14:32

3 odpowiedzi

Najlepsza odpowiedź

W OpenCV podane opcje progów (np. Cv.THRESH_BINARY lub cv.THRESH_BINARY_INV) są w rzeczywistości stałymi wartościami całkowitymi. Próbujesz użyć łańcuchów zamiast tych wartości całkowitych. To jest powód, dla którego pojawia się błąd typu. Jeśli chcesz zastosować wszystkie te różne progi w pętli, jedną z opcji jest utworzenie innej listy dla tych opcji, na przykład:

threshold_options = [cv.THRESH_BINARY, cv.THRESH_BINARY_INV, ...]

W ten sposób możesz następnie użyć wartości tej listy w pętli w następujący sposób:

retval, thresh = cv.threshold(img, 127, 255, threshold_options[i])

Cały kod wyglądałby następująco:

titles = [ 'THRESH_BINARY',
'THRESH_BINARY_INV',
'THRESH_MASK',
'THRESH_OTSU',
'THRESH_TOZERO',
'THRESH_TOZERO_INV',
'THRESH_TRIANGLE',
'THRESH_TRUNC']

threshold_options = [ cv.THRESH_BINARY,
cv.THRESH_BINARY_INV,
cv.THRESH_MASK,
cv.THRESH_OTSU,
cv.THRESH_TOZERO,
cv.THRESH_TOZERO_INV,
cv.THRESH_TRIANGLE,
cv.THRESH_TRUNC]


for i in range(len(titles)):
    retval, thresh = cv.threshold(img, 127, 255, threshold_options[i])
    plt.subplot(2,3,i+1), plt.title(titles[i]), plt.imshow(thresh, 'gray')
plt.show()
1
José Morano 31 marzec 2020, 12:03

Może to być powiązane: przykład progu OpenCV

Po pierwsze, nie ma potrzeby używania range, możesz po prostu zrobić for flag in titles: i zdać flag. Czy sprawdziłeś, czy obraz jest poprawnie załadowany? Czy jesteś pewien, że Twoja flaga odpowiada za Twój błąd?

W przypadku przyszłych postów podaj minimalny powtarzalny przykład.

0
code-lukas 31 marzec 2020, 11:51

Twój kod nie działa, ponieważ typ flag to int, a nie string.

Możesz wydrukować typ: print(type(cv.THRESH_BINARY)).
Wynik to <class 'int'>.

Możesz utworzyć listę int s:

th_flags = [cv.THRESH_BINARY, cv.THRESH_BINARY_INV, cv.THRESH_TRUNC, cv.THRESH_TOZERO, cv.THRESH_TOZERO_INV]

for th in th_flags:
    retval, thresh = cv.threshold(img, 127, 255, th)
    cv.imshow('thresh', thresh)
    cv.waitKey(1000)

cv.destroyAllWindows()

Kod nie obejmuje wszystkich możliwych opcji .
Za pomocą sumowania można połączyć kilka flag.

Przykład:

_, thresh = cv.threshold(img, 127, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
0
Rotem 31 marzec 2020, 11:54