Я изо всех сил пытаюсь (из-за отсутствия опыта работы с 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()
Тестовое изображение