'TypeError: объект' NoneType 'не повторяется' во время выполнения кода opencv / kivy / python - PullRequest
0 голосов
/ 10 июля 2020

Хорошо, последние 2 недели или около того я учил себя opencv и kivy, чтобы создать систему пользовательского интерфейса / камеры для автономной миссии из MATE ROV. (Мне не хочется объяснять MATE ROV, просто погуглите). Мне удалось создать как пользовательский интерфейс, так и реализацию камеры. Однако всякий раз, когда я go добавляю вычисление cv2.HoughLinesP, чтобы найти длину прямоугольника в моем тестовом изображении. [Тестовое изображение] [1] Меня создает код, выполняющийся в течение короткого промежутка времени (обычно он проходит через весь код пару раз), а затем я получаю следующее.

 Traceback (most recent call last):
   File "main.py", line 87, in <module>
     CamApp().run()
   File "/home/mlees/kivy_venv/lib/python3.6/site-packages/kivy/app.py", line 855, in run
     runTouchApp()
   File "/home/mlees/kivy_venv/lib/python3.6/site-packages/kivy/base.py", line 504, in runTouchApp
     EventLoop.window.mainloop()
   File "/home/mlees/kivy_venv/lib/python3.6/site-packages/kivy/core/window/window_sdl2.py", line 747, in mainloop
     self._mainloop()
   File "/home/mlees/kivy_venv/lib/python3.6/site-packages/kivy/core/window/window_sdl2.py", line 479, in _mainloop
     EventLoop.idle()
   File "/home/mlees/kivy_venv/lib/python3.6/site-packages/kivy/base.py", line 339, in idle
     Clock.tick()
   File "/home/mlees/kivy_venv/lib/python3.6/site-packages/kivy/clock.py", line 591, in tick
     self._process_events()
   File "kivy/_clock.pyx", line 384, in kivy._clock.CyClockBase._process_events
   File "kivy/_clock.pyx", line 414, in kivy._clock.CyClockBase._process_events
   File "kivy/_clock.pyx", line 412, in kivy._clock.CyClockBase._process_events
   File "kivy/_clock.pyx", line 167, in kivy._clock.ClockEvent.tick
   File "main.py", line 56, in update
     for line in buf8:
 TypeError: 'NoneType' object is not iterable

Понятия не имею, что вызывает эту ошибку, поэтому, если кто-нибудь может мне помочь, это было бы здорово. Полный код находится ниже.

from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.uix.image import Image
from kivy.uix.label import Label
from kivy.clock import Clock
from kivy.graphics.texture import Texture

import cv2
import numpy as np

class CamApp(App):

    def build(self):
        self.img0 = Image()
        self.img1 = Image()
        self.img2 = Image()
        self.img3 = Image()

        layout = GridLayout(cols = 4, rows = 3)

        layout.add_widget(self.img0)
        layout.add_widget(self.img1)
        layout.add_widget(Label(text="HELP"))
        layout.add_widget(Label(text="HELP"))
        layout.add_widget(self.img2)
        layout.add_widget(self.img3)
        layout.add_widget(Label(text="HELP"))
        layout.add_widget(Label(text="HELP"))
        layout.add_widget(Label(text="HELP"))
        layout.add_widget(Label(text="HELP"))
        layout.add_widget(Label(text="HELP"))
        layout.add_widget(Label(text="HELP"))

        #opencv2 stuffs
        self.capture = cv2.VideoCapture(0)
        Clock.schedule_interval(self.update, 1.0/33.0)
        return layout

    def update(self, dt):
        # display image from cam in opencv window
        ret, frame = self.capture.read()
        # Flip Image and set up first frame
        buf1 = cv2.flip(frame, -1)

        # Convert main frame to Grayscale
        buf3 = cv2.cvtColor(buf1, cv2.COLOR_BGR2GRAY)

        # Take Grayscale and add an adaptiveThreshold
        buf5 = cv2.adaptiveThreshold(buf3,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,2)

        # Edge detection and line detection
        buf7 = cv2.Canny(buf3,80,240,3)
        buf8 = cv2.HoughLinesP(buf7, 1, np.pi/180, 60, np.array([]), 50, 5)
        for line in buf8:
            for x1, y1, x2, y2 in line:
                cv2.line(buf8, (x1, y1), (x2, y2), (255, 255, 255), 4)
                distance_pixels = np.sqrt(np.square(x2 - x1) + np.square(y2 - y1))
                print(distance_pixels)

        # Necessary to display all the transformations and other bullshit
        buf0 = buf1.tostring()
        buf2 = buf3.tostring()
        buf4 = buf5.tostring()
        buf6 = buf7.tostring()

        # The next 9 lines are kivy bullshit to get the images on the screen.
        texture0 = Texture.create(size=(frame.shape[1], frame.shape[0]), colorfmt='bgr')
        texture1 = Texture.create(size=(frame.shape[1], frame.shape[0]), colorfmt='luminance')
        texture2 = Texture.create(size=(frame.shape[1], frame.shape[0]), colorfmt='luminance')
        texture3 = Texture.create(size=(frame.shape[1], frame.shape[0]), colorfmt='luminance')

        texture0.blit_buffer(buf0, colorfmt='bgr', bufferfmt='ubyte')
        texture1.blit_buffer(buf2, colorfmt='luminance', bufferfmt='ubyte')
        texture2.blit_buffer(buf4, colorfmt='luminance', bufferfmt='ubyte')
        texture3.blit_buffer(buf6, colorfmt='luminance', bufferfmt='ubyte')

        # display image from the texture
        self.img0.texture = texture0
        self.img1.texture = texture1
        self.img2.texture = texture2
        self.img3.texture = texture3

# Here's the running shit.
if __name__ == '__main__':
    CamApp().run()
    cv2.destroyAllWindows()

Заранее спасибо!

1 Ответ

0 голосов
/ 10 июля 2020

Эта ошибка возникает из-за того, что в некоторых случаях функция HoughLinesP () не находит ни одной строки, поэтому «buf8» имеет значение «None» в этих экземплярах.

Добавьте строку перед запуском for l oop чтобы проверить, является ли "buf8" "Нет" или нет. Если не процесс None, иначе процесс прервется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...