早上好,
我目前正试图通过在表面上发送激光片并收集其反射来研究液体表面的实时变形。我得到的通常是一个明亮的曲线在每一个时间步,我希望分析它的坐标。
因此,我编写了一个Python脚本,它显示在下面(分析部分是从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()然而,在相同的代码中使用cv和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到400 fps的速度运行,我甚至不确定这是否真的可行)?
谢谢你的关注
发布于 2014-11-26 13:36:46
好的,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,它只能以捕获所提供的速度运行。300 more看起来很荒谬,30 more更有可能。
https://stackoverflow.com/questions/27150169
复制相似问题