将LabVIEW与python接口以触发USB摄像头
LabVIEW支持pallete从python调用函数。我是否需要开发3个单独的函数,分别用于初始化、捕获和关闭?在python中使用OpenCV访问基于directshow的usb摄像头 如果我创建3个单独的函数,是否需要将它们包含在同一个python脚本中?就好像我使用while循环来捕获函数一样,之后编写的函数不可能被调用。如果我将它们保存在不同的python脚本中,它会识别出摄影机在同一会话中运行吗 为什么后续函数不识别“cam”将LabVIEW与python接口以触发USB摄像头,python,camera,labview,vision,Python,Camera,Labview,Vision,LabVIEW支持pallete从python调用函数。我是否需要开发3个单独的函数,分别用于初始化、捕获和关闭?在python中使用OpenCV访问基于directshow的usb摄像头 如果我创建3个单独的函数,是否需要将它们包含在同一个python脚本中?就好像我使用while循环来捕获函数一样,之后编写的函数不可能被调用。如果我将它们保存在不同的python脚本中,它会识别出摄影机在同一会话中运行吗 为什么后续函数不识别“cam” import cv2 import math impor
import cv2
import math
import os
camname = -1
img_name = "sample"
filepath = r"C:\Users\Public"
message = "sampler"
caminitok = False
inierror = False
def caminit(camname):
cam = cv2.VideoCapture(camname)
if not (cam.isOpened()):
return inierror == True
else:
return inierror == False
def camcapture(img_name, filepath, caminitok):
if caminitok == True:
ret, frame = cam.read()
os.chdir(filepath)
cv2.imwrite(img_name, frame)
def camclose():
cam.release()
首先,这与其说是labview问题,不如说是python问题 变量
cam
在caminit()
中创建,并在函数末尾删除。所以,camcapture()
和camclose()
不知道什么是cam
您可以将cam
添加到开头的变量列表中。然后,它总是被定义的,所有函数都可以读取它但是如果函数想要写入,python将创建一个同名的新变量,并将其用于函数的其余部分。最后,它将忘记新变量,并将原始变量放在适当的位置。因此,您需要在caminit()
中写入global-cam
,这会显式地告诉python写入全局变量。其他函数不需要这样做,因为它们处理变量,但不编写变量
import cv2
import math
import os
camname = -1
img_name = "sample"
filepath = r"C:\Users\Public"
message = "sampler"
caminitok = False
inierror = False
cam = None ##########
def caminit(camname):
global cam ##########
cam = cv2.VideoCapture(camname)
if not (cam.isOpened()):
return inierror == True
else:
return inierror == False
def camcapture(img_name, filepath, caminitok):
if caminitok == True:
ret, frame = cam.read()
os.chdir(filepath)
cv2.imwrite(img_name, frame)
def camclose():
cam.release()
进口cv2
输入数学
导入操作系统
camname=-1
img_name=“样本”
filepath=r“C:\Users\Public”
message=“采样器”
caminitok=False
错误=False
cam=无
def caminit(camname):
全局凸轮##########
cam=cv2.视频捕获(camname)
如果不是(cam.ISOPEND()):
返回INIRROR==True
其他:
返回INIRROR==False
def camcapture(img_名称、文件路径、caminitok):
如果caminitok==True:
ret,frame=cam.read()
chdir(文件路径)
cv2.imwrite(img_名称,帧)
def camclose():
cam.release()
每当我需要拍摄快照时,我就从LabVIEW调用这个脚本,效果很好。我还不明白为什么即使整个脚本工作正常,imagestate也不会返回“True”。与其使用全局变量,不如创建一个类来维护对外部资源的引用:
import cv2
import os
class Cam:
def __init__(self, camname):
self.cam = cv2.VideoCapture(camname)
self.caminitok = self.cam.isOpened()
def capture(self, img_name, filepath):
if self.caminitok:
ret, frame = self.cam.read()
os.chdir(filepath)
cv2.imwrite(img_name, frame)
def __del__(self):
self.cam.release()
用法:
>>> c = Cam(0)
>>> c.caminitok
True
>>> c.capture('foo.jpg', 'path/to/folder')
>>> del c
这相当于LabVIEW中的功能性全局VI,其中内部状态存储在移位寄存器中。sweber的回答很好,可能会解决您的问题。但您知道Wineman技术有一个免费的、源代码发布的双向LabVIEW/Python连接器吗?您可以从Python编写LabVIEW脚本,或者从LabVIEW调用Python函数。内置Python节点将不允许您使用Python控件LabVIEW。您好,sweber,非常感谢您的澄清。我创建这个程序时考虑到在labview中使用托盘的结构(初始化、运行while循环和停止功能)。事实证明python的工作方式不同(非常感谢您的解释,因为我能够清楚地理解原因),而且我只需要相机的快照,因此我从这里的源代码中获取了参考,并对其进行了修改,以使用LabVIEW。@Amlo4300如果您在python中定义一个函数,如
def myFun(foo,bar):return foo*bar
,这就像一个subVI,有两个输入端子foo
和bar
,还有一个输出端子。在函数内部指定的任何其他变量都类似于子VI内部的导线,不连接到输入或输出端子:它们无法从函数或子VI外部访问。imagestate
在开始时设置为False
,并且从不设置为其他任何内容。最后一行将其与True
进行比较,结果总是False
,这就是返回的结果。是的,我只想,但它在放置一个“=”符号时出现语法错误,我将再次检查,谢谢。在返回前设置imagestate=True,返回imagestate这很好,在labview中更容易理解,谢谢!
>>> c = Cam(0)
>>> c.caminitok
True
>>> c.capture('foo.jpg', 'path/to/folder')
>>> del c