2014-11-26 1 views
0

좋은 아침, 나는 현재 표면에 레이저 시트를 보내고 그것의 반사를 수집하여 실시간으로 액체 표면 변형을 연구하기 위해 노력하고있어파이썬/OpenCV의 : 카메라 영상의 흐름 레이저 곡선 분석

. 내가 얻는 것은 일반적으로 각 타임 스텝에서 밝은 곡선이며 좌표를 분석하고 싶습니다.

저는 파이썬 스크립트를 작성했습니다. 바로 아래에 표시되어 있습니다 (분석 부분은 laser curved line detection using opencv and python에서 다시 찍었습니다. 비디오로 작업한다는 것을 제외하고는 거의 정확하게 수행하려고합니다. 흐름) :

import cv2 
from PIL import Image 
import cv2.cv as cv 
import numpy as np 
import time 

myfile = open("hauteur.txt","w") 

#Import camera flow 

class Target: 

    def __init__(self): 
     self.capture = cv.CaptureFromCAM(0) 
     cv.namedWindow("Target", 1) 
     cv.SetCaptureProperty(self.capture,cv.CV_CAP_PROP_FRAME_WIDTH, 150) 
     cv.SetCaptureProperty(self.capture,cv.CV_CAP_PROP_FRAME_HEIGHT, 980) 
     cv.SetCaptureProperty(self.capture,cv.CV_CAP_PROP_FPS, 60) 

    def run(self): 
     frame = cv.QueryFrame(self.capture) 
     frame_size = cv.GetSize(frame) 
     color_image_cv = cv.CreateImage(cv.GetSize(frame), 8, 3) 
     color_image = np.array(color_image_cv) 
     grey_image = cv.CreateImage(cv.GetSize(frame), cv.IPL_DEPTH_8U, 1) 
     first = True 
     t = time.clock() 

     # Frame analysis 

     while True: 

      ret, bw = cv2.threshold(color_image, 0, 255, cv2.THRESH_BINARY) 
      contours, hierarchy = cv2.findContours(bw, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)       
      curves = np.zeros((img.shape[0], img.shape[1], 3), np.uint8) 

      for i in range(len(contours)): 
       for col in range(draw.shape[1]): 
        M = cv2.moments(draw[:, col]) 
        if M['m00'] != 0: 
          x = col 
          y = int (M['m01']/M['m00']) 
          curves[y, x, :] = (0, 0, 255) 
        res = {'X' : x, 'Y' : y, 't' : t} 
        print res 
        myfile.write('{X}\t{Y}\t{t}'.format(**res)) 
        myfile.write("\n") 

      cv2.ShowImage("Target", color_image) 
      # Listen for ESC key 
      c = cv2.WaitKey(7) % 0x100 
      if c == 27: 
        break 


if __name__=="__main__": 
    t = Target() 
    t.run() 

그러나 동일한 코드 내 이력서 및 CV2 기능의 사용은 좋은 혼란을 가져올 것으로 보인다 나는 오류를 얻을 줄에서

src data type = 17 is not supported 

ret, bw = cv2.threshold(color_image, 0, 255, cv2.THRESH_BINARY) 

이것은 cv 및 cv2 함수가 이미지를 만들고 저장하는 방식에서 발생하는 것으로 알고 있지만 시도한 변환 프로세스가 작동하지 않는 것 같으며 가져 오는 비디오 흐름에 삽입 할 동등한 cv2 함수를 찾지 못했습니다. (하지만, 당신이 이해할 수 있듯이, 나는 프로그래밍 프로가 아니므로 문서에서 필요한 것을 건너 뛸 수도 있습니다.) 이러한 cv 및 cv2 함수를 조정하거나 cv2 함수를 사용하여 동등한 카메라 흐름을 얻는 방법이 있습니까?

보너스 질문 :이 스크립트가 얼마나 빨리 실행될 수 있습니까? (결국이 스크립트가 300-400fps로 실행되어야한다고 생각해도 이것이 실제로 실현 가능한지조차 모르겠다)?

+1

cv2 인터페이스를 고수 할 수 있습니까? cv2.cv는 향후 제공되지 않을 예정이며 앞으로 제공 될 opencv3.0에서는 제공되지 않을 예정입니다. cv2는 이미지에 대해 numpy 배열을 사용하므로이를 준수해야합니다. – berak

+0

그게 내가하려는 일이지, 지금은 성공하지 못했다.하지만 내 카메라 흐름을 가져 오는 더 효율적인 방법을 모색 할 것이다. – Takeshin

답변

0

확인 귀하의 관심

감사합니다, CV2 비디오 코드 :

def __init__(self): 
     self.capture = cv2.VideoCapture(0) 
     cv2.namedWindow("Target", 1) 
     self.capture.set(cv2.CAP_PROP_FRAME_WIDTH, 150) 
     self.capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 980) 
     self.capture.set(cv2.CAP_PROP_FPS, 60) 

    def run(self): 
     ok, frame = self.capture.read() 
     gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY); 
     ... 

보너스 질문 : 캡처가 제공으로 OFC, 그것은 단지, 빠른 속도로 실행할 수 있습니다. 300fps는 어리석은 것처럼 보입니다. 30fps가 더 가능성이 있습니다.

+0

Aaaaand .. 이제 정말 쉽게 부끄러워서 의사에게이 기능들을 완전히 놓쳤습니다. 내 가장 깊은 감사합니다! – Takeshin

관련 문제