将LabVIEW与python接口以触发USB摄像头

将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

LabVIEW支持pallete从python调用函数。我是否需要开发3个单独的函数,分别用于初始化、捕获和关闭?在python中使用OpenCV访问基于directshow的usb摄像头

如果我创建3个单独的函数,是否需要将它们包含在同一个python脚本中?就好像我使用while循环来捕获函数一样,之后编写的函数不可能被调用。如果我将它们保存在不同的python脚本中,它会识别出摄影机在同一会话中运行吗

为什么后续函数不识别“cam”

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