OpenCV + Python + GigE视觉相机

5

我想问一下,是否有人知道是否可以使用OpenCV+Python和GigE Vision相机实现VideoCapture。我尝试使用cv2.VideoCapture(0),但总是获取集成网络摄像头的视频。我正在尝试新版本的OpenCV,并且使用Windows操作系统。

import numpy as np
import cv2

capture = cv2.VideoCapture(0)

while (True):
 frame = capture.read()
 cv2.imshow('camera',frame)
 if cv2.waitKey(1) & 0xFF == odd('q'):
  break

capture.release()
cv2.destroyAllWindows()

提前感谢。


尝试一下:print cv2.getBuildInformation() 我很确定,预编译的二进制文件不包含对pvapi或类似功能的支持。你需要相应的SDK,并从源代码重新构建。 - berak
好的,我已经获取到了您提供的信息,即PvAPI:NO和GigEVisionSDK:NO。那么,您能否详细解释一下如何从源代码重新构建呢?我的意思是,我已经安装了相机的SDK,但我不知道如何进行重建。谢谢。 - proveYourself
你需要cmake(-gui)、opencv源代码(以及一些依赖,如numpy)并从头开始重建整个项目 - berak
Genie one,我按照Python + OpenCV的步骤编写了自己的库,但是我仍然在NO中遇到了上述提到的标志。有什么想法吗? - proveYourself
你能取得进展吗?连接到Gige相机似乎需要再进行一步操作…例如指定IP地址或其他。对于带有“流(stream)”的IP相机,人们会传递流地址; cv2.VideoCapture('http://xxx.xxx.xxx.xxx'),但我认为Gige相机与IP相机不同;对于我的PointGrey Blackfly Gige相机,没有这样的流(stream),我收到了“OpenCV:无法从文件htttp://xxx.xxx.xxx.xxx读取视频流”的错误信息。 - user391339
显示剩余3条评论
4个回答

5
这个任务使用收割机可能更容易。它会为您提供所有所需的灵活性,并且针对GIGE相机进行了优化。 https://github.com/genicam/harvesters 我已经使用它一段时间了,看起来足够简单和快速。

请就此进行投票。请注意,Harvester为您提供了一种非常直观的方式,通过OpenCV操纵图像,并且能够处理不仅是GigE Vision相机还包括USB3 Vision相机!您可以在此页面找到最新的覆盖范围:https://github.com/genicam/harvesters#development-status - Doofah
@Doofah 你好,请问能否提供一个使用Harvesters读取GigE视觉相机的Python脚本示例链接? - Ahmed
1
@Ahmed您好,感谢您的评论。您可以在以下网址找到一些基本教程:https://github.com/genicam/harvesters/blob/master/src/harvesters/test/test_tutorials.py - Doofah

1
可能有一种方法可以做到这一点,一个名为Stemmer Imaging的德国公司开发了一个用于GenICam标准的Python库。那应该可以解决问题。目前我正在为自己研究如何完成相同的任务,以下是我找到的内容: 链接1以及链接2
个人而言,我到目前为止还无法让它工作,但这只是时间问题。

0

你应该使用harvesters来完成这个任务。

首先,你应该pip安装harvesters,并确保你正在使用Python版本3.6、3.7或3.8。接下来,你应该安装一个GenTL Producer。Matrix Vision生产者允许你使用任何相机制造商。如果你遇到问题,可以尝试不同的版本,我曾经遇到过最新版本的问题HERE

在安装MvGenTLAqcuire之后...链接.CTI文件并使用此代码连接相机。

from harvesters.core import Harvester 
h = Harvester()
gentl_file = r"C:\Program Files\MATRIX VISION\mvIMPACT Acquire\bin\x64\mvGenTLProducer.cti"

h.add_file(gentl_file)
ia = h.create(0)
with ia.fetch_buffer() as buffer:
                    component = buffer.payload.components[0]
                    print(buffer.payload.components)
                    _2d = component.data.reshape(component.height,component.width,                                          int(component.num_components_per_pixel))

                    frame = cv2.cvtColor(_2d,cv2.COLOR_BayerRG2RGB)

ia.stop_acquisition()
ia.destroy()

-5

在函数cv2.VideoCapture(int)中传递另一个整数值而不是0,可以选择连接的另一个摄像头。例如:cv2.VideoCapture(1)

import numpy as np
import cv2

capture = cv2.VideoCapture(1)

while (True):
 frame = capture.read()
 cv2.imshow('camera',frame)
 if cv2.waitKey(1) & 0xFF == odd('q'):
  break

capture.release()
cv2.destroyAllWindows()

OpenCV: 设备越界 (0-0):1。...它认为只有一个相机。不在以太网端口上搜索Gige相机,我怀疑?相机0是笔记本电脑相机。 - user391339

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接