2023.03.14
author:alian
function 海康威视摄像头取流
总结海康相机的取流步骤如下:
3 参数设置
6 销毁句柄
import sys
import threading
import os
import termios
import time
import cv2
import numpy as np
from ctypes import *
sys.path.append("/opt/MVS/Samples/64/Python/MvImport")
from MvImport.MvCameraControl_class import *
def creat_video():
time_stamp = time.time()
video_name = time.strftime("%Y%m%d%H%M%S", time.localtime(time_stamp))
writer = cv2.VideoWriter("%s.mp4" % video_name, cv2.VideoWriter_fourcc(*"mp4v"), 30, (img_w, img_h))
return writer,time_stamp
def work_thread_opencv(cam=0, pData=0, nDataSize=0,video_length=None):
img_w = 1920
img_h = 1080
stFrameInfo = MV_FRAME_OUT_INFO_EX()
memset(byref(stFrameInfo), 0, sizeof(stFrameInfo))
writer, time_stamp = creat_video()
while True:
ret = cam.MV_CC_GetOneFrameTimeout(pData, nDataSize, stFrameInfo, 1000)
if ret == 0:
print("get one frame: Width[%d], Height[%d], PixelType[0x%x], nFrameNum[%d]" % (
stFrameInfo.nWidth, stFrameInfo.nHeight, stFrameInfo.enPixelType, stFrameInfo.nFrameNum))
print(time.time()-time_stamp)
if video_length!=None and time.time()-time_stamp > video_length*3600:
writer.release()
writer, time_stamp = creat_video()
img = np.asarray(pData)
img = img.reshape(stFrameInfo.nHeight, stFrameInfo.nWidth, -1)
img = cv2.resize(img,(img_w,img_h))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
import tkinter as tk
root = tk.Tk()
width = root.winfo_screenwidth()
height = root.winfo_screenheight()
root.destroy()
cv2.imshow('View', cv2.resize(img, (width, height)))
writer.write(img)
if cv2.waitKey(24) & 0xFF == ord('q'):
break
else:
print("no data[0x%x]" % ret)
cv2.destroyAllWindows()
sys.exit()
def press_any_key_exit():
fd = sys.stdin.fileno()
old_ttyinfo = termios.tcgetattr(fd)
new_ttyinfo = old_ttyinfo[:]
new_ttyinfo[3] &= ~termios.ICANON
new_ttyinfo[3] &= ~termios.ECHO
termios.tcsetattr(fd, termios.TCSANOW, new_ttyinfo)
try:
os.read(fd, 7)
except:
finally:
termios.tcsetattr(fd, termios.TCSANOW, old_ttyinfo)
if __name__ == "__main__":
deviceList = MV_CC_DEVICE_INFO_LIST()
tlayerType = MV_GIGE_DEVICE | MV_USB_DEVICE
ret = MvCamera.MV_CC_EnumDevices(tlayerType, deviceList)
if ret != 0:
print("enum devices fail! ret[0x%x]" % ret)
sys.exit()
if deviceList.nDeviceNum == 0:
print("find no device!")
sys.exit()
print("Find %d devices!" % deviceList.nDeviceNum)
nConnectionNum = 0
cam = MvCamera()
stDeviceList = cast(deviceList.pDeviceInfo[int(nConnectionNum)], POINTER(MV_CC_DEVICE_INFO)).contents
ret = cam.MV_CC_CreateHandle(stDeviceList)
if ret != 0:
print("create handle fail! ret[0x%x]" % ret)
sys.exit()
ret = cam.MV_CC_OpenDevice(MV_ACCESS_Exclusive, 0)
if ret != 0:
print("open device fail! ret[0x%x]" % ret)
sys.exit()
ret = cam.MV_CC_SetEnumValue("TriggerMode", MV_TRIGGER_MODE_OFF)
if ret != 0:
print("set trigger mode fail! ret[0x%x]" % ret)
sys.exit()
stParam = MVCC_INTVALUE()
memset(byref(stParam), 0, sizeof(MVCC_INTVALUE))
ret = cam.MV_CC_GetIntValue("PayloadSize", stParam)
if ret != 0:
print("get payload size fail! ret[0x%x]" % ret)
sys.exit()
nPayloadSize = stParam.nCurValue
ret = cam.MV_CC_StartGrabbing()
if ret != 0:
print("start grabbing fail! ret[0x%x]" % ret)
sys.exit()
data_buf = (c_ubyte * nPayloadSize)()
try:
hThreadHandle = threading.Thread(target=work_thread_opencv, args=(cam, data_buf, nPayloadSize))
hThreadHandle.start()
hThreadHandle.join()
except:
print("error: unable to start thread")
ret = cam.MV_CC_StopGrabbing()
if ret != 0:
print("stop grabbing fail! ret[0x%x]" % ret)
del data_buf
sys.exit()
ret = cam.MV_CC_CloseDevice()
if ret != 0:
print("close deivce fail! ret[0x%x]" % ret)
del data_buf
sys.exit()
ret = cam.MV_CC_DestroyHandle()
if ret != 0:
print("destroy handle fail! ret[0x%x]" % ret)
del data_buf
sys.exit()
del data_buf
最近在进行机器视觉系统的搭建,积累了经验,想和大家讨论、互相学习。相机是图像的来源。为了搭建视觉系统,完成图像分析、机器视觉任务,需要编程控制相机按工作所需的曝光、增益和帧率同步采集和存储图像。工业相机通常支持C/C++程序进行控制,提供了SDK(Software Development Kit)。这些SDK包括对相机进行基本控制的函数,利用这些函数,就可以控制相机参数(如曝光时间、增益、帧率、像素格式),满足视觉系统任务需求。
1.1相机选型
工业相机分为彩色工业(...
1.1.下载SDK
海康威视的工业相机二次开发首先是需要在官方下载相机的SDK,下载地址_官方下载地址,根据自身的环境区下载需要的SDK,本人下载的是(机器视觉工业相机客户端MVS V3.3.1(Windows)).
下载后打开下图中的文件,是VS+C++的Demo,本人用到的是第一个demo,打开相机保存图片.
本文接上次的博客海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一),上个博客中并未用到QT,本文介绍项目内容及源码,供大家参考。
由于我的项目中是用海康相机作为拍照的一个中介,重点是在目标识别方向,请阅读源码时自动忽略。
如果对目标识别感兴趣,可以参考我的YOLO系列
https://blog.csdn.net/qq_45445740/category_9794819.html
目录1.说明1.1 环境配置1.2 背景说明2.源码MvCamera.hmythread.
海康工业相机SDK提供了完整的C++接口,可以方便地进行二次开发。以下是一些基本步骤:
1. 下载并安装海康相机SDK,包括相机控制器、设备驱动程序、示例程序等。
2. 创建一个C++项目,将SDK的头文件和库文件添加到项目中。
3. 在代码中创建相机对象,并初始化相机参数,例如分辨率、曝光时间、增益等。
4. 调用相机对象的StartGrabbing()函数开始采集图像,可以将采集到的图像保存到本地文件或显示到窗口中。
5. 在需要的时候可以调用相机对象的StopGrabbing()函数停止采集图像。
6. 在程序结束时,调用相机对象的Close()函数关闭相机连接。
需要注意的是,海康相机SDK提供了丰富的示例程序和文档,可以帮助开发者更快地上手。在开发过程中,可以参考示例程序和文档,根据自己的需求进行二次开发。