save_image2local函数部分,主要是将C程序给过来的数据流进行了一个转换,仔细看保存的路径不难看出,img_buff就是我们想要的图像数据流。
但是我把它print出来的时候它仍然是一个C*ubyte的数据类型,所以没法直接用python-opencv进行直接读取,即不能直接转成numpy array的形式。
只能先将其存储下来然后再通过cv2进行读取来进行一系列图片操作。
file_path是我们图片存储的路径,可以自己更改。原本下面有一个输入a退出的按钮但没有反应,所以我删掉了它。
再到之后就是关闭数据流,关闭摄像头操作。因为博主没法直接读取数据流不能直接视频显示,没法得知这个数据是实时更新图像还是一次整体运行获取一次图像信息,所以我的方法是整体运行关闭一次采集一次数据,非常麻烦。
from os import times
import cv2
import sys
import numpy as np
import time
from ctypes import *
sys.path.append("C:\Program Files (x86)\MVS\Development\Samples\Python\MvImport")
from MvCameraControl_class import *
class HHV:
def __init__(self,):
self.init_cam()
for i in range(10):
st = time.time()
img = self.get_image_array()
print(img.shape)
print("st:", time.time()-st)
self.exit_cam()
def get_image_array(self):
self.save_image2local(index=0)
img = cv2.imread("AfterConvert_RGB0.jpg")
return img
def init_cam(self,):
deviceList = MV_CC_DEVICE_INFO_LIST()
tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE
ret = MvCamera.MV_CC_EnumDevices(tlayerType, deviceList)
nConnectionNum = 0
self.cam = MvCamera()
stDeviceList = cast(deviceList.pDeviceInfo[int(nConnectionNum)],
POINTER(MV_CC_DEVICE_INFO)).contents
ret = self.cam.MV_CC_CreateHandle(stDeviceList)
ret = self.cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
ret = self.cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_OFF)
stParam = MVCC_INTVALUE()
memset(byref(stParam), 0, sizeof(MVCC_INTVALUE))
ret = self.cam.MV_CC_GetIntValue("PayloadSize", stParam)
self.nPayloadSize = stParam.nCurValue
def save_image2local(self, index=0):
ret = self.cam.MV_CC_StartGrabbing()
stDeviceList = MV_FRAME_OUT_INFO_EX()
memset(byref(stDeviceList), 0, sizeof(stDeviceList))
self.data_buf = (c_ubyte * self.nPayloadSize)()
ret = self.cam.MV_CC_GetOneFrameTimeout(byref(self.data_buf), self.nPayloadSize, stDeviceList, 1000)
if ret == 0:
nRGBSize = stDeviceList.nWidth * stDeviceList.nHeight * 3
stConvertParam=MV_SAVE_IMAGE_PARAM_EX()
stConvertParam.nWidth = stDeviceList.nWidth
stConvertParam.nHeight = stDeviceList.nHeight
stConvertParam.pData = self.data_buf
stConvertParam.nDataLen = stDeviceList.nFrameLen
stConvertParam.enPixelType = stDeviceList.enPixelType
stConvertParam.nImageLen = stConvertParam.nDataLen
stConvertParam.nJpgQuality = 70
stConvertParam.enImageType = MV_Image_Jpeg
stConvertParam.pImageBuffer = (c_ubyte * nRGBSize)()
stConvertParam.nBufferSize = nRGBSize
ret = self.cam.MV_CC_SaveImageEx2(stConvertParam)
if ret != 0:
print ("convert pixel fail ! ret[0x%x]" % ret)
del self.data_buf
sys.exit()
file_path = "AfterConvert_RGB"+str(index)+".jpg"
file_open = open(file_path.encode('ascii'), 'wb+')
img_buff = (c_ubyte * stConvertParam.nImageLen)()
cdll.msvcrt.memcpy(byref(img_buff), stConvertParam.pImageBuffer, stConvertParam.nImageLen)
file_open.write(img_buff)
def exit_cam(self,):
ret = self.cam.MV_CC_StopGrabbing()
if ret != 0:
print ("stop grabbing fail! ret[0x%x]" % ret)
del self.data_buf
sys.exit()
ret = self.cam.MV_CC_CloseDevice()
if ret != 0:
print ("close deivce fail! ret[0x%x]" % ret)
del self.data_buf
sys.exit()
ret = self.cam.MV_CC_DestroyHandle()
if ret != 0:
print ("destroy handle fail! ret[0x%x]" % ret)
del self.data_buf
sys.exit()
del self.data_buf
if __name__ == "__main__":
hhv = HHV()
目前缺芯的大环境也影响到工业相机上面了,使用支持国产海康机器人的工业相机进行视觉开发是不错的替代方案。价格交期很是感人呐!
参考文章python调用海康工业相机并用opencv显示(整体实现)
博主写的很全面非常好。
PyQt显示相机图像本文推荐另一种方法“将numpy array 先转化为 Pillow image 再转化为Pixmap” 并用来显示。
主要步骤:
(1)HikRobot 官网下载安装“机器视觉工业相机客户端MVS V3.3.1(Windows)”, 下载链接。
(2)安装后参考官网自.
海康工业相机录像存图功能介绍在使用工业相机做日常的数据采集,分析过程中,存图、录像功能必不可少,但是在使用该功能中,会出现丢帧、少图等现象,本文简单介绍下存图、录像使用过程中的技术瓶颈与解决方法,本文以介绍连续抓图为主,录像功能原理基本一致;............
Linux下:
def work_thread(cam=0, data_buf=0, nDataSize=0):
stFrameInfo = MV_FRAME_OUT_INFO_EX()
memset(byref(st...
Python 安装pypylon
建议先下载pypylon轮子文件(下载地址),下载后Pip install 轮子文件, 安装即可。
注意不要用Python 3.8, pypylon 只能支持到Python3.7。
Basler相机
连上电源、插上网线,用Pylon Viewer 配置相机参数
定义几个函数采集数据、保存照片
from pypylon import pylon
import cv2...
电眼监控设备是否到位–信号传递给网络继电器(聚英的设备)–服务端监控继电器输入–打开相机采集图像–图像分类算法–返回结果进行逻辑处理–输出信号
1、下载海康MVS的客户端,文件包中有相关python例子;找到MvImport工具包
2、借助flask部署海康抓拍和一个简单的图像分类模型(resNet)
sys.path.append("./MvImport") #导入工具包
#模型部署相关代码
device = torch.device("cuda:0" if torch.cuda.is_availab
通过python调用海康威视工业摄像头并进行图像存储问题(数据流获取问题未能解决)
先说情况,本人是做视觉检测的需要高倍率摄像头进行实时检测,也就是需要深度学习进行图片数据处理,但是这个又是python来进行分析,而海康威视主要程序代码是以C为主的,传过来的数据我也尝试的去解析都是不能转化成python的BGR图像。
具体参照了:通过cv2调用海康威视摄像头,但这个不能调用工业摄像头,通过官方给一个400什么软件要激活摄像头,可是却并不能检测到工业摄像头,通过mvs软件调用到摄像头地址进行测试也无法获取到摄
相机SDK:CH-HCNetSDKV6.1.6.45_build20210302_win64
首先,海康网络相机的读取和工业相机不是同一个SDK包,工业相机的SDK包去海康机器人下载,网络相机的SDK包去海康威视下载。工业相机控制软件MVS目录下有python SDK包使用示例,非