Хотите знать, как соединить линии, показанные на верхнем левом изображении веб-камеры opencv - PullRequest
0 голосов
/ 10 июля 2020

Я изо всех сил пытаюсь (из-за отсутствия опыта работы с opencv) найти весь прямоугольник, нарисованный на тестовом изображении внизу. В настоящее время код, как показано на изображении ниже, находит только очень небольшую часть прямоугольника. Я попытался изменить минимальную и максимальную длину строки, пытаясь решить проблему, но это не сработало. Последним применением этого кода будет определение общей длины стороны прямоугольной призмы angular, поэтому мне не стоит оставлять эту проблему как есть. (Код и тестовое изображение ниже)

Вывод кода

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)

        # I get tired easy with repitition if you can tell.
        layout.add_widget(self.img0)
        layout.add_widget(self.img1)
        layout.add_widget(Label(text="Place Holder"))
        layout.add_widget(Label(text="Place Holder"))
        layout.add_widget(self.img2)
        layout.add_widget(self.img3)
        layout.add_widget(Label(text="Place Holder"))
        layout.add_widget(Label(text="Place Holder"))
        layout.add_widget(Label(text="Place Holder"))
        layout.add_widget(Label(text="Place Holder"))
        layout.add_widget(Label(text="Place Holder"))
        layout.add_widget(Label(text="Place Holder"))

        #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)
        if np.any(buf8) == True:
            print(buf8)

            for line in buf8:
                for x1, y1, x2, y2 in line:
                    cv2.line(buf1, (x1, y1), (x2, y2), (0, 0, 255), 5)
                    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()

Тестовое изображение

Ответы [ 2 ]

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

После установления порога вместо использования HoughLinesP для обнаружения используйте функцию findContours () для поиска контуров.

См. Здесь информацию о контурах.

Примечание которые находят контуры на вашем изображении с помощью флага RETR_EXTERNAL. Найдя контуры, нарисуйте эти контуры на новом черном изображении с толщиной = -1. Теперь примените эрозию и растяжение к этому изображению, чтобы удалить шум, а затем снова найдите контур таким же образом. Это даст вам контур требуемого прямоугольника.

Если все же найдено более одного контура, возьмите контур с максимальной площадью. (Поскольку очевидно, что этот прямоугольник будет максимальной площади). Для получения информации о площади контура обратитесь к этому .

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

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

Ладно, разобрался. Я использовал неправильную функцию. Поэтому вместо использования функции houghlines я должен был использовать функцию рисования контуров. Приносим извинения за возможные проблемы.

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