2014-01-06 5 views
0

웹캠 이미지를 스트리밍하는 간단한 스크립트가 있는데 liveimage에서 줄을 감지하는 canny-filter 및 hough 변환과 같은 일부 작업을 수행하려고합니다.Python : 사용자 입력을 OpenCV 라이브 웹캠 이미지와 병행하여 입력하는 입력란을 입력하십시오.

import cv2 
import math 

# Init 
cap = cv2.VideoCapture(0) 

while(True): 
    # Capture frame-by-frame 
    ret, frame = cap.read() 

    # Our operations on the frame come here 
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 

    # Display the resulting frame 
    cv2.imshow('frame1',frame) 
    cv2.imshow('frame2',gray) 
    cv2.moveWindow('frame1', 200, 10) 
    cv2.moveWindow('frame2', 200+660, 10) 

    # (3.) 
    edges = cv2.Canny(frame, 40, 100) 
    cv2.imshow('lines',edges) 
    cv2.moveWindow('lines', 200, 10+530) 

    # hough 
    lines = cv2.HoughLinesP(edges, 1, math.pi/2, 20, None, 100, 10) 
    edgeimg = gray 
    if not lines is None: 
     for line in lines[0]: 
      pt1 = (line[0],line[1]) 
      pt2 = (line[2],line[3]) 
      cv2.line(edgeimg, pt1, pt2, (255,0,0), 3) 
     cv2.imshow('hough',edgeimg) 
     cv2.moveWindow('hough', 200+660, 10+530) 

    # cv2.imshow('img',img) 
    if cv2.waitKey(1) & 0xFF == ord('q'): 
     break 

# When everything done, release the capture 
cap.release() 
cv2.destroyAllWindows() 

문제는 내가 조정할 영리한 필터와 무릎 기능의 매개 변수를 미세 필요가 있고, 따라서 나는 몇 가지 입력 상자를 만들기 위해 좋아하는 liveimage-창에 병렬로 실행 거라고 여기서 내가 할 수있는 그 값을 입력하십시오.

저는 코딩 오버 헤드를 줄이고 tkinter를 선택할 수있는 가장 간단한 해결책을 생각했습니다. 하지만 난 tkinter 상자를 병렬로 실행하는 데 어려움을 겪고있다. (단지이 솔루션을 여기에서 발견했다 : How do you run your own code alongside Tkinter's event loop?) 라이브 이미지를 매우 느리게 만든다. 게시물 # 1의 코드를 사용하면 내 liveimage를 넣을 수있다. task 기능.

내 코드에서 canny/houghlines의 매개 변수로 사용되는 숫자를 사용자가 입력 할 수있는 입력 상자를 표시하는 간단한 해결책을 제안 할 수 있습니까?

덕분에

+2

opencv와 함께 제공되는 슬라이더를 사용할 수 있습니까? 그들은 매우 제한적입니다. –

+0

Ah. 저는 cv2에서 사용할 수 있는지 궁금합니다. docs에서 볼 수 없기 때문입니다. http://docs.opencv.org/modules/highgui/doc/ user_interface.html # createtrackbar 사용할 수없는 이유는 무엇입니까? import cv2.cv as cv'와 같은 오래된 opencv 버전을 가져 와서'cv.CreateTrackbar (..)'명령을 통해 사용하는 방법입니까 ?? – tim

+0

오, 그래, 고마워, 매력처럼 작동! 훌륭한. opencv의 명령 중 일부가 * old *'cv'를 통해서만 액세스 할 수 있고 아직 cv2로 포팅되지 않은 이유는 무엇입니까? 나는 그것에 대해 궁금해하고있다 .. – tim

답변

2

나는 그들이 CV2 네임 스페이스에 믿습니다. 내 버전은 2.4.5입니다.

import cv2 
import numpy as np 

def onTrackbarChange(trackbarValue): 
    pass 

cv2.namedWindow('ctrl') 
cv2.createTrackbar('thresh', 'ctrl', 128, 255, onTrackbarChange) 
c = cv2.VideoCapture(0) 
while(1): 
    im = c.read()[1] 
    thresh=cv2.threshold(cv2.cvtColor(im,cv2.COLOR_BGR2GRAY), 
     cv2.getTrackbarPos('thresh','ctrl'), 
     255,cv2.THRESH_BINARY)[1] 
    cv2.imshow('thresh',thresh) 
    if cv2.waitKey(1)==27: 
     exit(0) 
+0

이상하지만 문서에서 이것을 설명하지 않거나 나는 무엇인가 잘못 알고 있는가? 하지만 여전히 잘 작동합니다 .-) – tim

+2

잘 일반적으로'print dir (cv2)'하고 'help (cv2.threshold)'와 같은 것을 찾았습니다. 문서를 참조 할 필요가 거의 없습니다. –

+0

Ah 팁을 보내 주셔서 감사 드리며 항상 내 작업 흐름을 최적화하기 위해 새로운 것을 배우고 자합니다 :-) – tim