Как добавить опорную линию для подсчета объектов на конвейере с помощью opencv Python tkinter - PullRequest
0 голосов
/ 06 января 2020

Я пытаюсь создать систему видения, которая может считать шоколад, движущийся на конвейере с переменной скоростью. Использование OpenCV и python. Аналогично этому: enter image description here

Я перепробовал множество решений, представленных в Stackoverflow, но ни одно из них не помогло. В связи с этим я прошу помощи у экспертов в этом сообществе для реализации помощи в приведенном ниже коде.

Каким-то образом мне удается создать Tkinter GUI с помощью cv2.VideoCapture.

Код, который я прикрепил, имеет только окно Tkinter для показа видеопотока. Я хочу добавить код, чтобы он показывал контрольную линию в видеокадре, как показано на рисунке ниже.

Требуется раздел справки: 1. Я хотел реализовать опорную линию для видеокадра, чтобы, когда объект пересекает линию, он считал объект.

Как я мог бы отделить капли и извлечь соответствующие центроиды.

Мне нужно увеличить переменную подсчета, если центроид пересекает контрольную границу.

Код:

import cv2
import tkinter as tk
from tkinter import *
from tkinter.ttk  import Frame
from PIL import Image, ImageTk

white       = "#ffffff"
lightBlue2  = "#adc5ed"
font        = "Constantia"
fontButtons = (font, 12)
maxWidth    = 800
maxHeight   = 480

#Graphics window
mainWindow = tk.Tk()
mainWindow.configure(bg=lightBlue2)
mainWindow.geometry('%dx%d+%d+%d' % (maxWidth,maxHeight,0,0))
mainWindow.resizable(0,0)
# mainWindow.overrideredirect(1)

mainFrame = Frame(mainWindow)
mainFrame.place(x=20, y=20)

#Capture video frames
lmain = tk.Label(mainFrame)
lmain.grid(row=0, column=0)

cap = cv2.VideoCapture(0)

def show_frame():
    ret, frame = cap.read()

    cv2image   = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)

    img   = Image.fromarray(cv2image).resize((760, 400))
    imgtk = ImageTk.PhotoImage(image = img)
    lmain.imgtk = imgtk
    lmain.configure(image=imgtk)
    lmain.after(10, show_frame)

closeButton = Button(mainWindow, text = "CLOSE", font = fontButtons, bg = white, width = 20, height= 1)
closeButton.configure(command= lambda: mainWindow.destroy())
closeButton.place(x=270,y=430)

show_frame()  #Display
mainWindow.mainloop()  #Starts GUI

Ожидается GUI enter image description here

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Спасибо, @Gil за ваши усилия. Это было очень полезно.

После поиска в Google я наткнулся на ответ, который удовлетворяет моим требованиям. Я буду очень благодарен экспертам этого сообщества, если они помогут мне в реализации следующих логик c в окне Tkinter со следующими кнопками / трекбарами / виджетами ввода (любой из них будет работать):

  1. Снимок
  2. Закрыть
  3. lineypos
  4. lineypos2
  5. minarea
  6. maxarea

В настоящее время я ввожу это значение в свой скрипт. Но мне нужна помощь в реализации этой логики в Tkinter, чтобы я мог манипулировать этими значениями вручную. Чтобы обратиться за помощью, я должен опубликовать следующий вопрос. Я предоставил решение в разделе кода по ссылке ниже. Как создать окно tkinter и прикрепить кнопку управления tkinter для видеокадра OpenCV, чтобы манипулировать значениями вручную

0 голосов
/ 07 января 2020
До сих пор

ваш код может только захватывать видео ('' ret, frame = cap.read () '') и отображать его через GUI (сборка Tkinter).

Следующими вашими шагами будет: - нарисовать линию на экране (используйте функцию cv2.line с набором координат x, y).

- обработать изображение, чтобы удалить ненужную информацию, а затем обнаружить Форма / контуры на изображении для сегментирования шоколадного прямоугольника.

- чтобы определить центроид, вы можете попробовать cv2.moments или рассчитать его вручную, если вы знаете размеры прямоугольника.

- для подсчета объект, когда они прошли линию, я бы просто использовал оператор if с позицией объекта в пикселях x / y:

давайте предположим, что ваш конвейер перемещает объект справа налево

if object_position_x < detected_line_position:
    counter = counter+1
    print (counter)
else:
   print (counter)

Если вы просто хотите нарисовать вертикальную линию, используйте этот код

import cv2

def viewImage(image):
    cv2.namedWindow('Display', cv2.WINDOW_NORMAL)
    cv2.imshow('Display', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


image = cv2.imread('myimage.JPG')

#the 2 lines below are using the image.shape attributes to automatically calculate the dimension of the image
#basically it says : startpoint = middle column of the image, line 0
#                    endpoint = middle column of the image, last row
start_point = ((int(image.shape[1]/2)), 0) 
end_point = ( (int(image.shape[1]/2)), (int(image.shape[0])) )
color = (0, 0, 255)
thickness = 2

cv2.line(image, start_point, end_point, color, thickness)
viewImage(image)

надеюсь, это поможет

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