当前位置: 首页 > news >正文

hikvision SDK使用学习/实践

  函数介绍

//1. 枚举设备int MV_CC_EnumDevices(unsigned int nTLayerType, MV_CC_DEVICE_INFO_LIST *pstDevList);
//2. 创建设备句柄int MV_CC_CreateHandle(void **handle, const MV_CC_DEVIEC_INFO *pstDevInfo);
//参数:handle  [out]  //设备句柄,输出参数;pstDevInfo  [in]  //设备信息版本、MAC地址、传输层类型以及其它设备信息;//返回值://成功,返回MV_OK (0);失败,返回错误码。//3. 关闭设备int MV_CC_CloseDevice(void *handle);
//参数:handle  [in]  //设备句柄,MV_CC_CreateHandle或MV_CC_CreateHandleWithoutLog的[out]参数。//4. 释放句柄int MV_CC_DestroyHandle(void *handle);
// 5. 注册图像数据回调函数,支持获取chunk信息int MV_CC_RegisterImageCallBackEx(void *handle, const char *pEventName, \cbEvent cbEvent, void *pUser);
//参数://pEventName  [in]  事件名;//fEventCallBack  [in]  接收Event事件的回调函数//pUser  [in]  用户自定义变量//6. 开始采集图像int MV_CC_StartGrabbing(void *handle);
//7. 获取一帧图像数据int MV_CC_GetOneFrame(void *handle, unsigned char *pData, \unsigned int nDataSize, \MV_FRAME_OUT_INFO *pFrameInfo
); 
//参数:pData  [in] // 用于保存图像数据的缓存地址;nDataSize  [in] // 缓存区大小;pFrameInfo  [out] // 获取到的帧信息;//8. 获取相机节点值int MV_CC_GetIntValue(void *handle, const char *strKey, MVCC_INTVALUE *pIntValue);
//参数:strKey  [in] // 节点名称;pIntValue  [out] // 获取到的节点值;//可以用来获取需要的节点值。

自己实践代码:

camera.hpp

#ifndef CAMERA_CLASS_H_INCLUDED
#define CAMERA_CLASS_H_INCLUDED#include "/opt/MVS/include/MvCameraControl.h"
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <cmath>
#include <cstddef>
#include <fcntl.h>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/video/video.hpp>
#include <opencv4/opencv2/imgproc/types_c.h>
#include <opencv4/opencv2/opencv.hpp>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
#include <vector>
using namespace std;
using namespace cv;
class camera;#ifdef __cplusplus
extern "C"{class camera {
private:void *handle;bool g_bExit;int nRet;unsigned int g_nPayloadSize;unsigned char *pDataForRGB;unsigned char *pData;unsigned char *pDataForSaveImage;MV_CC_DEVICE_INFO *pDeviceInfo;MV_CC_DEVICE_INFO_LIST stDeviceList;MVCC_INTVALUE stParam;MV_FRAME_OUT stOutFrame;MV_CC_PIXEL_CONVERT_PARAM CvtParam;MV_SAVE_IMAGE_PARAM_EX stSaveParam;MV_FRAME_OUT_INFO_EX stImageInfo;public:camera();bool PrintDeviceInfo(MV_CC_DEVICE_INFO *);void close_cam();void start_cam();void get_pic();void re_iso();
};}#endif
#endif // CAMERA_CLASS_H_INCLUDED

 camera.cpp

#include "camera.hpp"camera::camera() {nRet = MV_OK;handle = NULL;g_bExit = false;g_nPayloadSize = 0;pData = NULL;pDataForSaveImage = NULL;pDataForRGB = (unsigned char *)malloc(1280 * 680 * 4 + 2048);memset(&stParam, 0, sizeof(MVCC_INTVALUE));CvtParam = {0};stOutFrame = {0};memset(&stOutFrame, 0, sizeof(MV_FRAME_OUT));
}
void camera::start_cam() {memset(&stDeviceList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &stDeviceList);if (MV_OK != nRet) {printf("MV_CC_EnumDevices fail! nRet [%x]\n", nRet);return;}unsigned int nIndex = 0;if (stDeviceList.nDeviceNum > 0) {for (unsigned int i = 0; i < stDeviceList.nDeviceNum; i++) {pDeviceInfo = stDeviceList.pDeviceInfo[i];if (NULL == pDeviceInfo) {break;} else if (strcmp((char *)pDeviceInfo->SpecialInfo.stGigEInfo.chSerialNumber,"DA1645182") == 0) {nIndex = i;PrintDeviceInfo(pDeviceInfo);break;}}} else {cout << "Find no Device" << endl;}// 选择设备并创建句柄nRet = MV_CC_CreateHandle(&handle, stDeviceList.pDeviceInfo[nIndex]);if (MV_OK != nRet) {printf("MV_CC_CreateHandle fail! nRet [%x]\n", nRet);return;}// 打开设备nRet = MV_CC_OpenDevice(handle);if (MV_OK != nRet) {printf("MV_CC_OpenDevice fail! nRet [%x]\n", nRet);return;}// // ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal// package size(It only works for the GigE camera)if (stDeviceList.pDeviceInfo[nIndex]->nTLayerType == MV_GIGE_DEVICE) {int nPacketSize = MV_CC_GetOptimalPacketSize(handle);if (nPacketSize > 0) {nRet = MV_CC_SetIntValue(handle, "GevSCPSPacketSize", nPacketSize);if (nRet != MV_OK) {printf("Warning: Set Packet Size fail nRet [0x%x]!\n", nRet);}} else {printf("Warning: Get Packet Size fail nRet [0x%x]!\n", nPacketSize);}}nRet = MV_CC_SetEnumValue(handle, "TriggerMode", 0);if (MV_OK != nRet) {printf("MV_CC_SetTriggerMode fail! nRet [%x]\n", nRet);return;}// ch:获取数据包大小 | en:Get payload sizememset(&stParam, 0, sizeof(MVCC_INTVALUE));nRet = MV_CC_GetIntValue(handle, "PayloadSize", &stParam);if (MV_OK != nRet) {printf("Get PayloadSize fail! nRet [0x%x]\n", nRet);return;}nRet = MV_CC_StartGrabbing(handle);if (MV_OK != nRet) {printf("MV_CC_StartGrabbing fail! nRet [%x]\n", nRet);return;}
}bool camera::PrintDeviceInfo(MV_CC_DEVICE_INFO *pstMVDevInfo) {if (NULL == pstMVDevInfo) {printf("The Pointer of pstMVDevInfo is NULL!\n");return false;}if (pstMVDevInfo->nTLayerType == MV_GIGE_DEVICE) {int nIp1 =((pstMVDevInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0xff000000) >> 24);int nIp2 =((pstMVDevInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0x00ff0000) >> 16);int nIp3 =((pstMVDevInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0x0000ff00) >> 8);int nIp4 = (pstMVDevInfo->SpecialInfo.stGigEInfo.nCurrentIp & 0x000000ff);// ch:打印当前相机ip和用户自定义名字 | en:print current ip and user defined// nameprintf("Device Model Name: %s\n",pstMVDevInfo->SpecialInfo.stGigEInfo.chModelName);printf("CurrentIp: %d.%d.%d.%d\n", nIp1, nIp2, nIp3, nIp4);// printf("UserDefinedName: %s\n\n" ,// pstMVDevInfo->SpecialInfo.stGigEInfo.chUserDefinedName);} else if (pstMVDevInfo->nTLayerType == MV_USB_DEVICE) {printf("Device Model Name: %s\n",pstMVDevInfo->SpecialInfo.stUsb3VInfo.chModelName);// printf("UserDefinedName: %s\n\n",// pstMVDevInfo->SpecialInfo.stUsb3VInfo.chUserDefinedName);} else {printf("Not support.\n");}return true;
}
void camera::close_cam() {int nRet = MV_CC_StopGrabbing(handle);if (MV_OK == nRet)cout << "Stopped Grabbing !" << endl;nRet = MV_CC_DestroyHandle(handle);if (MV_OK != nRet) {printf("MV_CC_DestroyHandle fail! nRet [%x]\n", nRet);return;}
}void camera::get_pic() {MV_FRAME_OUT_INFO_EX stImageInfo = {0};memset(&stImageInfo, 0, (sizeof(MV_FRAME_OUT_INFO_EX)) );pData = (unsigned char *)malloc((sizeof(unsigned char) * stParam.nCurValue ) );if (NULL == pData) {return;}unsigned int nDataSize = stParam.nCurValue;nRet = MV_CC_GetOneFrameTimeout(handle, pData, nDataSize, &stImageInfo, 1000);if (nRet == MV_OK){cout << pData <<endl;printf("Now you GetOneFrame, Width[%d], Height[%d], nFrameNum[%d]\n\n", stImageInfo.nWidth, stImageInfo.nHeight, stImageInfo.nFrameNum);// 处理图像// image processingprintf("	0 	to do nothing\n");printf("	1 	to convert RGB\n");printf("	2 	to save as BMP\n");printf("Please Input Index: ");int nInput = 0;scanf("%d", &nInput);switch (nInput){// 不做任何事,继续往下走// do nothing, and go on nextcase 0: {break;}// 转换图像为RGB格式,用户可根据自身需求转换其他格式// convert image format to RGB, user can convert to other format by their requirementcase 1: {pDataForRGB = (unsigned char*)malloc(stImageInfo.nWidth * stImageInfo.nHeight * 4 + 2048);if (NULL == pDataForRGB){break;}// 像素格式转换// convert pixel format MV_CC_PIXEL_CONVERT_PARAM stConvertParam = {0};// 从上到下依次是:图像宽,图像高,输入数据缓存,输入数据大小,源像素格式,// 目标像素格式,输出数据缓存,提供的输出缓冲区大小// Top to bottom are:image width, image height, input data buffer, input data size, source pixel format, // destination pixel format, output data buffer, provided output buffer sizestConvertParam.nWidth = stImageInfo.nWidth;stConvertParam.nHeight = stImageInfo.nHeight;stConvertParam.pSrcData = pData;stConvertParam.nSrcDataLen = stImageInfo.nFrameLen;stConvertParam.enSrcPixelType = stImageInfo.enPixelType;stConvertParam.enDstPixelType = PixelType_Gvsp_RGB8_Packed;stConvertParam.pDstBuffer = pDataForRGB;stConvertParam.nDstBufferSize = stImageInfo.nWidth * stImageInfo.nHeight *  4 + 2048;nRet = MV_CC_ConvertPixelType(handle, &stConvertParam);if (MV_OK != nRet){printf("MV_CC_ConvertPixelType fail! nRet [%x]\n", nRet);break;}FILE* fp = fopen("AfterConvert_RGB.raw", "wb");if (NULL == fp){printf("fopen failed\n");break;}fwrite(pDataForRGB, 1, stConvertParam.nDstLen, fp);fclose(fp);printf("convert succeed\n");break;}case 2:{pDataForSaveImage = (unsigned char*)malloc(stImageInfo.nWidth * stImageInfo.nHeight * 4 + 2048);if (NULL == pDataForSaveImage){break;}// 填充存图参数// fill in the parameters of save imageMV_SAVE_IMAGE_PARAM_EX stSaveParam;memset(&stSaveParam, 0, sizeof(MV_SAVE_IMAGE_PARAM_EX));// 从上到下依次是:输出图片格式,输入数据的像素格式,提供的输出缓冲区大小,图像宽,// 图像高,输入数据缓存,输出图片缓存,JPG编码质量// Top to bottom are:stSaveParam.enImageType = MV_Image_Bmp; stSaveParam.enPixelType = stImageInfo.enPixelType; stSaveParam.nBufferSize = stImageInfo.nWidth * stImageInfo.nHeight * 4 + 2048;stSaveParam.nWidth      = stImageInfo.nWidth; stSaveParam.nHeight     = stImageInfo.nHeight; stSaveParam.pData       = pData;stSaveParam.nDataLen    = stImageInfo.nFrameLen;stSaveParam.pImageBuffer = pDataForSaveImage;stSaveParam.nJpgQuality = 80;nRet = MV_CC_SaveImageEx2(handle, &stSaveParam);if(MV_OK != nRet){printf("failed in MV_CC_SaveImage,nRet[%x]\n", nRet);break;}FILE* fp = fopen("ig.bmp", "wb");if (NULL == fp){printf("fopen failed\n");break;}fwrite(pDataForSaveImage, 1, stSaveParam.nImageLen, fp);fclose(fp);printf("save image succeed\n");break;}default:break;}}else{printf("No data[%x]\n", nRet);}
}
void camera::re_iso() {MV_CC_SetEnumValue(handle, "BalanceWhiteAuto", 2);MV_CC_SetEnumValue(handle, "ExposureAuto", 1);
}
void PressEnterToExit(void) {int c;while ((c = getchar()) != '\n' && c != EOF);fprintf(stderr, "\nPress enter to exit.\n");while (getchar() != '\n');
}

 main.cpp


#include "camera.hpp"int main() {int key;camera cam;cam.start_cam();int c;while (1) {cam.get_pic();if ((c = getchar()) == '\n') {cam.close_cam();break;}}return 0;
}

参考:https://www.cnblogs.com/xiawuhao2013/p/9295781.html

相关文章:

  • MySQL_1. mysql数据库介绍
  • 37.从0到上线三天搭建个人网站(第一天)
  • qt使用wimlib-imagex,做windows系统备份还原
  • 人工智能时代AIGC绘画实战
  • 西南科技大学模拟电子技术实验六(BJT电压串联负反馈放大电路)预习报告
  • Shein、Temu拓荒背后,中国快递业“卷”向海外
  • [HTML]Web前端开发技术7(HTML5、CSS3、JavaScript )CSS的定位机制——喵喵画网页
  • FPGA串口接收解帧、并逐帧发送有效数据——1
  • 字符串和内存函数(1)
  • 基于SSM框架的《超市订单管理系统》Web项目开发(第五天)供应商管理,增删改查
  • 【漏洞复现】速达软件存在任意文件上传
  • 《内蒙古自治区“十四五”能源发展规划》明确提出,重点打造()、 阿拉善盟和内蒙古东部的通辽市等地区千万千瓦级风电基地。
  • 虹科案例 | OPC UA SDK快速扩展VIMANA智能制造软件连接性
  • 代码随想录刷题题Day5
  • ultralytics yolo图像分类训练案例;pytorch自有数据集图像分类案例
  • 3.7、@ResponseBody 和 @RestController
  • ComponentOne 2017 V2版本正式发布
  • Consul Config 使用Git做版本控制的实现
  • ES6系统学习----从Apollo Client看解构赋值
  • js操作时间(持续更新)
  • Laravel 菜鸟晋级之路
  • uni-app项目数字滚动
  • 动态规划入门(以爬楼梯为例)
  • 计算机在识别图像时“看到”了什么?
  • 区块链技术特点之去中心化特性
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 数据仓库的几种建模方法
  • 数据科学 第 3 章 11 字符串处理
  • 推荐一个React的管理后台框架
  • 小程序button引导用户授权
  • 优秀架构师必须掌握的架构思维
  • elasticsearch-head插件安装
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • ​水经微图Web1.5.0版即将上线
  • # 数论-逆元
  • #pragma multi_compile #pragma shader_feature
  • #QT(串口助手-界面)
  • (4)logging(日志模块)
  • (52)只出现一次的数字III
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (pytorch进阶之路)扩散概率模型
  • (八)c52学习之旅-中断实验
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .Family_物联网
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .Net Core和.Net Standard直观理解
  • .NET DataGridView数据绑定说明