海康威视相机在QTcreate上的使用教程
文章目录
- 前言:
- 基础夯实:
- 效果展示:
- 图片展示:
- 视频展示:
- 参考的资料:
- 遇到问题:
- 问题1:int64 does not
- 问题2:LNK2019
- 配置思路(这个很重要)
- 配置关键图片:
- 配置具体过程:
- 核心代码:
- MvCamera.h
- MvCamera.cpp
- widget.cpp
前言:
海康威视的教程里面,关于C++的教程,编译环境是VS,所以想使用QTcreate对于海康威视的相机进行使用,包括查找设备,打开设备,关闭设备,开始采集,停止采集,软触发,触发一次,保存bmp,保存jpg,保存tiff,保存png,调节曝光,增益,帧率。
基础夯实:
在MVS中海康威视的相关教程:MVS链接
下载完成之后按照这个目录(我是下载的的D盘),可以找到VS的教程:D:\MVS\Development\Samples\VC\VS
如果你需要QT上的教程,请继续向下观看。
效果展示:
图片展示:
视频展示:
HKshow
参考的资料:
在这个过程中,我参考了很多的资料,包括VS里面的例程代码,但是我水平有限,不能直接搬运VS中的代码。
资料:参考资料1,参考资料2
简单对资料进行说明,介绍了环境的安装,包括opencv,sdk的头文件,库文件,二次封装的MvCamera.h和MvCamera.cpp文件。环境的安装是极其容易出错的过程,环境没问题,其他的才能正常的运行。
遇到问题:
问题1:int64 does not
这个是你mingw设置的opencv,但是你却用msvc打开了。这个编译环境必须一致。
问题2:LNK2019
你的opencv库没有连接好,路径问题或者camke问题,系统环境问题这都是有可能的。
配置思路(这个很重要)
首先你下载MVS之后,里面lib文件和头文件,头文件全要(参考配置图片),库文件只要一个(MvCameraControl.lib)。你需要把二次封装的函数导入你的QT下面里面,就是MvCamera.h和MvCamera.cpp这两个文件,如果你只进行导入也可以,因为你用到了opencv,不要纠结要不要使用opencv,直接用就行了,很方便,当时纠结了,想直接使用那两个文件,一直被卡。opencv按照教程按装就行了,按照mingw那个流程,在QT的pro文件中使用绝对路径,别使用相对路径(不使用导入库那个选项),因为我当时导入库就没成功。头文件直接包含,在直接的文件中导入一下,看一下有没有报错,没有保存说明导入成功。这里的MvCamera.cpp和MvCamera.h是不能直接使用的,需要在里面添加一些内容,直接使用也是会报错,原因就是你使用了opencv。最后,大佬使用的是导入.h文件,我需要ui文件,我就自己进行更改了,如果有需要ui文件的,评论区发qq邮箱,我源码或者ui可以私发你学习。基本上按照这个思路,成功搭建环境到运行应该是没有问题的。
配置关键图片:
配置具体过程:
海康威视相机在QTcreate上的环境配置教程(qt+opencv+海康SDK)
核心代码:
MvCamera.h
/************************************************************************/
/* 以C++接口为基础,对常用函数进行二次封装,方便用户使用 */
/************************************************************************/#ifndef _MV_CAMERA_H_
#define _MV_CAMERA_H_#include "MvCameraControl.h"
#include <string.h>#include "opencv2/opencv.hpp"//注意此处可能会跟系统函数定义冲突
using namespace cv;#ifndef MV_NULL
#define MV_NULL 0
#endifclass CMvCamera
{
public:CMvCamera();~CMvCamera();// ch:获取SDK版本号 | en:Get SDK Versionstatic int GetSDKVersion();// ch:枚举设备 | en:Enumerate Devicestatic int EnumDevices(unsigned int nTLayerType, MV_CC_DEVICE_INFO_LIST* pstDevList);// ch:判断设备是否可达 | en:Is the device accessiblestatic bool IsDeviceAccessible(MV_CC_DEVICE_INFO* pstDevInfo, unsigned int nAccessMode);// ch:打开设备 | en:Open Deviceint Open(MV_CC_DEVICE_INFO* pstDeviceInfo);// ch:关闭设备 | en:Close Deviceint Close();// ch:判断相机是否处于连接状态 | en:Is The Device Connectedbool IsDeviceConnected();// ch:注册图像数据回调 | en:Register Image Data CallBackint RegisterImageCallBack(void(__stdcall* cbOutput)(unsigned char * pData, MV_FRAME_OUT_INFO_EX* pFrameInfo, void* pUser), void* pUser);// ch:开启抓图 | en:Start Grabbingint StartGrabbing();// ch:停止抓图 | en:Stop Grabbingint StopGrabbing();// ch:主动获取一帧图像数据 | en:Get one frame initiativelyint GetImageBuffer(MV_FRAME_OUT* pFrame, int nMsec);// ch:释放图像缓存 | en:Free image bufferint FreeImageBuffer(MV_FRAME_OUT* pFrame);// ch:显示一帧图像 | en:Display one frame imageint DisplayOneFrame(MV_DISPLAY_FRAME_INFO* pDisplayInfo);// ch:设置SDK内部图像缓存节点个数 | en:Set the number of the internal image cache nodes in SDKint SetImageNodeNum(unsigned int nNum);// ch:获取设备信息 | en:Get device informationint GetDeviceInfo(MV_CC_DEVICE_INFO* pstDevInfo);// ch:获取GEV相机的统计信息 | en:Get detect info of GEV cameraint GetGevAllMatchInfo(MV_MATCH_INFO_NET_DETECT* pMatchInfoNetDetect);// ch:获取U3V相机的统计信息 | en:Get detect info of U3V cameraint GetU3VAllMatchInfo(MV_MATCH_INFO_USB_DETECT* pMatchInfoUSBDetect);// ch:获取和设置Int型参数,如 Width和Height,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件// en:Get Int type parameters, such as Width and Height, for details please refer to MvCameraNode.xlsx file under SDK installation directoryint GetIntValue(IN const char* strKey, OUT MVCC_INTVALUE_EX *pIntValue);int SetIntValue(IN const char* strKey, IN int64_t nValue);// ch:获取和设置Enum型参数,如 PixelFormat,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件// en:Get Enum type parameters, such as PixelFormat, for details please refer to MvCameraNode.xlsx file under SDK installation directoryint GetEnumValue(IN const char* strKey, OUT MVCC_ENUMVALUE *pEnumValue);int SetEnumValue(IN const char* strKey, IN unsigned int nValue);int SetEnumValueByString(IN const char* strKey, IN const char* sValue);int GetEnumEntrySymbolic(IN const char* strKey, IN MVCC_ENUMENTRY* pstEnumEntry);// ch:获取和设置Float型参数,如 ExposureTime和Gain,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件// en:Get Float type parameters, such as ExposureTime and Gain, for details please refer to MvCameraNode.xlsx file under SDK installation directoryint GetFloatValue(IN const char* strKey, OUT MVCC_FLOATVALUE *pFloatValue);int SetFloatValue(IN const char* strKey, IN float fValue);// ch:获取和设置Bool型参数,如 ReverseX,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件// en:Get Bool type parameters, such as ReverseX, for details please refer to MvCameraNode.xlsx file under SDK installation directoryint GetBoolValue(IN const char* strKey, OUT bool *pbValue);int SetBoolValue(IN const char* strKey, IN bool bValue);// ch:获取和设置String型参数,如 DeviceUserID,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件UserSetSave// en:Get String type parameters, such as DeviceUserID, for details please refer to MvCameraNode.xlsx file under SDK installation directoryint GetStringValue(IN const char* strKey, MVCC_STRINGVALUE *pStringValue);int SetStringValue(IN const char* strKey, IN const char * strValue);// ch:执行一次Command型命令,如 UserSetSave,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件// en:Execute Command once, such as UserSetSave, for details please refer to MvCameraNode.xlsx file under SDK installation directoryint CommandExecute(IN const char* strKey);// ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)int GetOptimalPacketSize(unsigned int* pOptimalPacketSize);// ch:注册消息异常回调 | en:Register Message Exception CallBackint RegisterExceptionCallBack(void(__stdcall* cbException)(unsigned int nMsgType, void* pUser), void* pUser);// ch:注册单个事件回调 | en:Register Event CallBackint RegisterEventCallBack(const char* pEventName, void(__stdcall* cbEvent)(MV_EVENT_OUT_INFO * pEventInfo, void* pUser), void* pUser);// ch:强制IP | en:Force IPint ForceIp(unsigned int nIP, unsigned int nSubNetMask, unsigned int nDefaultGateWay);// ch:配置IP方式 | en:IP configuration methodint SetIpConfig(unsigned int nType);// ch:设置网络传输模式 | en:Set Net Transfer Modeint SetNetTransMode(unsigned int nType);// ch:像素格式转换 | en:Pixel format conversionint ConvertPixelType(MV_CC_PIXEL_CONVERT_PARAM* pstCvtParam);// ch:保存图片 | en:save imageint SaveImage(MV_SAVE_IMAGE_PARAM_EX* pstParam);// ch:保存图片为文件 | en:Save the image as a fileint SaveImageToFile(MV_SAVE_IMG_TO_FILE_PARAM* pstParam);// ch:绘制圆形辅助线 | en:Draw circle auxiliary lineint DrawCircle(MVCC_CIRCLE_INFO* pCircleInfo);// ch:绘制线形辅助线 | en:Draw lines auxiliary lineint DrawLines(MVCC_LINES_INFO* pLinesInfo);//读取bufferint ReadBuffer(Mat &image);private:void *m_hDevHandle;//用于保存图像的缓存unsigned int m_nBufSizeForSaveImage;};#endif//_MV_CAMERA_H_
MvCamera.cpp
#include "mvcamera.h"CMvCamera::CMvCamera()
{m_hDevHandle = MV_NULL;
}CMvCamera::~CMvCamera()
{if (m_hDevHandle){MV_CC_DestroyHandle(m_hDevHandle);m_hDevHandle = MV_NULL;}
}// ch:获取SDK版本号 | en:Get SDK Version
int CMvCamera::GetSDKVersion()
{return MV_CC_GetSDKVersion();
}// ch:枚举设备 | en:Enumerate Device
int CMvCamera::EnumDevices(unsigned int nTLayerType, MV_CC_DEVICE_INFO_LIST* pstDevList)
{return MV_CC_EnumDevices(nTLayerType, pstDevList);
}// ch:判断设备是否可达 | en:Is the device accessible
bool CMvCamera::IsDeviceAccessible(MV_CC_DEVICE_INFO* pstDevInfo, unsigned int nAccessMode)
{return MV_CC_IsDeviceAccessible(pstDevInfo, nAccessMode);
}// ch:打开设备 | en:Open Device
int CMvCamera::Open(MV_CC_DEVICE_INFO* pstDeviceInfo)
{if (MV_NULL == pstDeviceInfo){return MV_E_PARAMETER;}if (m_hDevHandle){return MV_E_CALLORDER;}int nRet = MV_CC_CreateHandle(&m_hDevHandle, pstDeviceInfo);if (MV_OK != nRet){return nRet;}nRet = MV_CC_OpenDevice(m_hDevHandle);if (MV_OK != nRet){MV_CC_DestroyHandle(m_hDevHandle);m_hDevHandle = MV_NULL;}return nRet;
}// ch:关闭设备 | en:Close Device
int CMvCamera::Close()
{if (MV_NULL == m_hDevHandle){return MV_E_HANDLE;}MV_CC_CloseDevice(m_hDevHandle);int nRet = MV_CC_DestroyHandle(m_hDevHandle);m_hDevHandle = MV_NULL;return nRet;
}// ch:判断相机是否处于连接状态 | en:Is The Device Connected
bool CMvCamera::IsDeviceConnected()
{return MV_CC_IsDeviceConnected(m_hDevHandle);
}// ch:注册图像数据回调 | en:Register Image Data CallBack
int CMvCamera::RegisterImageCallBack(void(__stdcall* cbOutput)(unsigned char * pData, MV_FRAME_OUT_INFO_EX* pFrameInfo, void* pUser), void* pUser)
{return MV_CC_RegisterImageCallBackEx(m_hDevHandle, cbOutput, pUser);
}// ch:开启抓图 | en:Start Grabbing
int CMvCamera::StartGrabbing()
{return MV_CC_StartGrabbing(m_hDevHandle);
}// ch:停止抓图 | en:Stop Grabbing
int CMvCamera::StopGrabbing()
{return MV_CC_StopGrabbing(m_hDevHandle);
}// ch:主动获取一帧图像数据 | en:Get one frame initiatively
int CMvCamera::GetImageBuffer(MV_FRAME_OUT* pFrame, int nMsec)
{return MV_CC_GetImageBuffer(m_hDevHandle, pFrame, nMsec);
}// ch:释放图像缓存 | en:Free image buffer
int CMvCamera::FreeImageBuffer(MV_FRAME_OUT* pFrame)
{return MV_CC_FreeImageBuffer(m_hDevHandle, pFrame);
}// ch:设置显示窗口句柄 | en:Set Display Window Handle
int CMvCamera::DisplayOneFrame(MV_DISPLAY_FRAME_INFO* pDisplayInfo)
{return MV_CC_DisplayOneFrame(m_hDevHandle, pDisplayInfo);
}// ch:设置SDK内部图像缓存节点个数 | en:Set the number of the internal image cache nodes in SDK
int CMvCamera::SetImageNodeNum(unsigned int nNum)
{return MV_CC_SetImageNodeNum(m_hDevHandle, nNum);
}// ch:获取设备信息 | en:Get device information
int CMvCamera::GetDeviceInfo(MV_CC_DEVICE_INFO* pstDevInfo)
{return MV_CC_GetDeviceInfo(m_hDevHandle, pstDevInfo);
}// ch:获取GEV相机的统计信息 | en:Get detect info of GEV camera
int CMvCamera::GetGevAllMatchInfo(MV_MATCH_INFO_NET_DETECT* pMatchInfoNetDetect)
{if (MV_NULL == pMatchInfoNetDetect){return MV_E_PARAMETER;}MV_CC_DEVICE_INFO stDevInfo = {0};GetDeviceInfo(&stDevInfo);if (stDevInfo.nTLayerType != MV_GIGE_DEVICE){return MV_E_SUPPORT;}MV_ALL_MATCH_INFO struMatchInfo = {0};struMatchInfo.nType = MV_MATCH_TYPE_NET_DETECT;struMatchInfo.pInfo = pMatchInfoNetDetect;struMatchInfo.nInfoSize = sizeof(MV_MATCH_INFO_NET_DETECT);memset(struMatchInfo.pInfo, 0, sizeof(MV_MATCH_INFO_NET_DETECT));return MV_CC_GetAllMatchInfo(m_hDevHandle, &struMatchInfo);
}// ch:获取U3V相机的统计信息 | en:Get detect info of U3V camera
int CMvCamera::GetU3VAllMatchInfo(MV_MATCH_INFO_USB_DETECT* pMatchInfoUSBDetect)
{if (MV_NULL == pMatchInfoUSBDetect){return MV_E_PARAMETER;}MV_CC_DEVICE_INFO stDevInfo = {0};GetDeviceInfo(&stDevInfo);if (stDevInfo.nTLayerType != MV_USB_DEVICE){return MV_E_SUPPORT;}MV_ALL_MATCH_INFO struMatchInfo = {0};struMatchInfo.nType = MV_MATCH_TYPE_USB_DETECT;struMatchInfo.pInfo = pMatchInfoUSBDetect;struMatchInfo.nInfoSize = sizeof(MV_MATCH_INFO_USB_DETECT);memset(struMatchInfo.pInfo, 0, sizeof(MV_MATCH_INFO_USB_DETECT));return MV_CC_GetAllMatchInfo(m_hDevHandle, &struMatchInfo);
}// ch:获取和设置Int型参数,如 Width和Height,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件
// en:Get Int type parameters, such as Width and Height, for details please refer to MvCameraNode.xlsx file under SDK installation directory
int CMvCamera::GetIntValue(IN const char* strKey, OUT MVCC_INTVALUE_EX *pIntValue)
{return MV_CC_GetIntValueEx(m_hDevHandle, strKey, pIntValue);
}int CMvCamera::SetIntValue(IN const char* strKey, IN int64_t nValue)
{return MV_CC_SetIntValueEx(m_hDevHandle, strKey, nValue);
}// ch:获取和设置Enum型参数,如 PixelFormat,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件
// en:Get Enum type parameters, such as PixelFormat, for details please refer to MvCameraNode.xlsx file under SDK installation directory
int CMvCamera::GetEnumValue(IN const char* strKey, OUT MVCC_ENUMVALUE *pEnumValue)
{return MV_CC_GetEnumValue(m_hDevHandle, strKey, pEnumValue);
}int CMvCamera::SetEnumValue(IN const char* strKey, IN unsigned int nValue)
{return MV_CC_SetEnumValue(m_hDevHandle, strKey, nValue);
}int CMvCamera::SetEnumValueByString(IN const char* strKey, IN const char* sValue)
{return MV_CC_SetEnumValueByString(m_hDevHandle, strKey, sValue);
}int CMvCamera::GetEnumEntrySymbolic(IN const char* strKey, IN MVCC_ENUMENTRY* pstEnumEntry)
{return MV_CC_GetEnumEntrySymbolic(m_hDevHandle, strKey, pstEnumEntry);
}// ch:获取和设置Float型参数,如 ExposureTime和Gain,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件
// en:Get Float type parameters, such as ExposureTime and Gain, for details please refer to MvCameraNode.xlsx file under SDK installation directory
int CMvCamera::GetFloatValue(IN const char* strKey, OUT MVCC_FLOATVALUE *pFloatValue)
{return MV_CC_GetFloatValue(m_hDevHandle, strKey, pFloatValue);
}int CMvCamera::SetFloatValue(IN const char* strKey, IN float fValue)
{return MV_CC_SetFloatValue(m_hDevHandle, strKey, fValue);
}// ch:获取和设置Bool型参数,如 ReverseX,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件
// en:Get Bool type parameters, such as ReverseX, for details please refer to MvCameraNode.xlsx file under SDK installation directory
int CMvCamera::GetBoolValue(IN const char* strKey, OUT bool *pbValue)
{return MV_CC_GetBoolValue(m_hDevHandle, strKey, pbValue);
}int CMvCamera::SetBoolValue(IN const char* strKey, IN bool bValue)
{return MV_CC_SetBoolValue(m_hDevHandle, strKey, bValue);
}// ch:获取和设置String型参数,如 DeviceUserID,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件UserSetSave
// en:Get String type parameters, such as DeviceUserID, for details please refer to MvCameraNode.xlsx file under SDK installation directory
int CMvCamera::GetStringValue(IN const char* strKey, MVCC_STRINGVALUE *pStringValue)
{return MV_CC_GetStringValue(m_hDevHandle, strKey, pStringValue);
}int CMvCamera::SetStringValue(IN const char* strKey, IN const char* strValue)
{return MV_CC_SetStringValue(m_hDevHandle, strKey, strValue);
}// ch:执行一次Command型命令,如 UserSetSave,详细内容参考SDK安装目录下的 MvCameraNode.xlsx 文件
// en:Execute Command once, such as UserSetSave, for details please refer to MvCameraNode.xlsx file under SDK installation directory
int CMvCamera::CommandExecute(IN const char* strKey)
{return MV_CC_SetCommandValue(m_hDevHandle, strKey);
}// ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)
int CMvCamera::GetOptimalPacketSize(unsigned int* pOptimalPacketSize)
{if (MV_NULL == pOptimalPacketSize){return MV_E_PARAMETER;}int nRet = MV_CC_GetOptimalPacketSize(m_hDevHandle);if (nRet < MV_OK){return nRet;}*pOptimalPacketSize = (unsigned int)nRet;return MV_OK;
}// ch:注册消息异常回调 | en:Register Message Exception CallBack
int CMvCamera::RegisterExceptionCallBack(void(__stdcall* cbException)(unsigned int nMsgType, void* pUser),void* pUser)
{return MV_CC_RegisterExceptionCallBack(m_hDevHandle, cbException, pUser);
}// ch:注册单个事件回调 | en:Register Event CallBack
int CMvCamera::RegisterEventCallBack(const char* pEventName, void(__stdcall* cbEvent)(MV_EVENT_OUT_INFO * pEventInfo, void* pUser), void* pUser)
{return MV_CC_RegisterEventCallBackEx(m_hDevHandle, pEventName, cbEvent, pUser);
}// ch:强制IP | en:Force IP
int CMvCamera::ForceIp(unsigned int nIP, unsigned int nSubNetMask, unsigned int nDefaultGateWay)
{return MV_GIGE_ForceIpEx(m_hDevHandle, nIP, nSubNetMask, nDefaultGateWay);
}// ch:配置IP方式 | en:IP configuration method
int CMvCamera::SetIpConfig(unsigned int nType)
{return MV_GIGE_SetIpConfig(m_hDevHandle, nType);
}// ch:设置网络传输模式 | en:Set Net Transfer Mode
int CMvCamera::SetNetTransMode(unsigned int nType)
{return MV_GIGE_SetNetTransMode(m_hDevHandle, nType);
}// ch:像素格式转换 | en:Pixel format conversion
int CMvCamera::ConvertPixelType(MV_CC_PIXEL_CONVERT_PARAM* pstCvtParam)
{return MV_CC_ConvertPixelType(m_hDevHandle, pstCvtParam);
}// ch:保存图片 | en:save image
int CMvCamera::SaveImage(MV_SAVE_IMAGE_PARAM_EX* pstParam)
{return MV_CC_SaveImageEx2(m_hDevHandle, pstParam);
}// ch:保存图片为文件 | en:Save the image as a file
int CMvCamera::SaveImageToFile(MV_SAVE_IMG_TO_FILE_PARAM* pstSaveFileParam)
{return MV_CC_SaveImageToFile(m_hDevHandle, pstSaveFileParam);
}// ch:绘制圆形辅助线 | en:Draw circle auxiliary line
int CMvCamera::DrawCircle(MVCC_CIRCLE_INFO* pCircleInfo)
{return MV_CC_DrawCircle(m_hDevHandle, pCircleInfo);
}// ch:绘制线形辅助线 | en:Draw lines auxiliary line
int CMvCamera::DrawLines(MVCC_LINES_INFO* pLinesInfo)
{return MV_CC_DrawLines(m_hDevHandle, pLinesInfo);
}//读取相机中的图像
int CMvCamera::ReadBuffer(Mat &image)
{Mat* getImage = new Mat();unsigned int nRecvBufSize = 0;MVCC_INTVALUE stParam;memset(&stParam, 0, sizeof(MVCC_INTVALUE));int tempValue = MV_CC_GetIntValue(m_hDevHandle, "PayloadSize", &stParam);if (tempValue != 0){return -1;}nRecvBufSize = stParam.nCurValue;unsigned char* pDate;pDate=(unsigned char *)malloc(nRecvBufSize);MV_FRAME_OUT_INFO_EX stImageInfo = {0};tempValue= MV_CC_GetOneFrameTimeout(m_hDevHandle, pDate, nRecvBufSize, &stImageInfo, 700);if(tempValue!=0){return -1;}m_nBufSizeForSaveImage = stImageInfo.nWidth * stImageInfo.nHeight * 3 + 2048;unsigned char* m_pBufForSaveImage;m_pBufForSaveImage = (unsigned char*)malloc(m_nBufSizeForSaveImage);bool isMono;switch (stImageInfo.enPixelType){case PixelType_Gvsp_Mono8:case PixelType_Gvsp_Mono10:case PixelType_Gvsp_Mono10_Packed:case PixelType_Gvsp_Mono12:case PixelType_Gvsp_Mono12_Packed:isMono=true;break;default:isMono=false;break;}if(isMono){*getImage = Mat(stImageInfo.nHeight,stImageInfo.nWidth,CV_8UC1,pDate);//imwrite("d:\\测试opencv_Mono.tif", image);}else{//转换图像格式为BGR8MV_CC_PIXEL_CONVERT_PARAM stConvertParam = {0};memset(&stConvertParam, 0, sizeof(MV_CC_PIXEL_CONVERT_PARAM));stConvertParam.nWidth = stImageInfo.nWidth; //ch:图像宽 | en:image widthstConvertParam.nHeight = stImageInfo.nHeight; //ch:图像高 | en:image height//stConvertParam.pSrcData = m_pBufForDriver; //ch:输入数据缓存 | en:input data bufferstConvertParam.pSrcData = pDate; //ch:输入数据缓存 | en:input data bufferstConvertParam.nSrcDataLen = stImageInfo.nFrameLen; //ch:输入数据大小 | en:input data sizestConvertParam.enSrcPixelType = stImageInfo.enPixelType; //ch:输入像素格式 | en:input pixel formatstConvertParam.enDstPixelType = PixelType_Gvsp_BGR8_Packed; //ch:输出像素格式 | en:output pixel format 适用于OPENCV的图像格式//stConvertParam.enDstPixelType = PixelType_Gvsp_RGB8_Packed; //ch:输出像素格式 | en:output pixel formatstConvertParam.pDstBuffer = m_pBufForSaveImage; //ch:输出数据缓存 | en:output data bufferstConvertParam.nDstBufferSize = m_nBufSizeForSaveImage; //ch:输出缓存大小 | en:output buffer sizeMV_CC_ConvertPixelType(m_hDevHandle, &stConvertParam);*getImage = Mat(stImageInfo.nHeight,stImageInfo.nWidth,CV_8UC3,m_pBufForSaveImage);//imwrite("d:\\测试opencv_Color.tif", image);}(*getImage).copyTo(image);(*getImage).release();free(pDate);free(m_pBufForSaveImage);return 0;
}
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include<QMessageBox>
#include<QDebug>
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),m_bOpenDevice(false),m_nDeviceCombo(0),m_nTriggerMode(MV_TRIGGER_MODE_OFF),m_bStartGrabbing(false),m_pcMyCamera(NULL),m_pSaveImageBuf(NULL),m_nSaveImageBufSize(0),m_bSoftWareTriggerCheck(false), m_nTriggerSource(MV_TRIGGER_SOURCE_SOFTWARE),m_dExposureEdit(0),m_dGainEdit(0),m_dFrameRateEdit(0),m_isDeviceReady(false)
{m_WorkThread=new WorkThread(*this);ui->setupUi(this);setWindowTitle("海康相机");InitUi();connect(ui->searchDeviceBtn ,SIGNAL(clicked()),this,SLOT(slot_searchDevice()));connect(ui->openDeviceBtn ,SIGNAL(clicked()),this,SLOT(slot_openDevice()));connect(ui->closeDeviceBtn ,SIGNAL(clicked()),this,SLOT(slot_closeDevice()));connect(ui->continusModeBtn ,SIGNAL(clicked()),this,SLOT(slot_continusModeBtn()));connect(ui->triggerModeBtn ,SIGNAL(clicked()),this,SLOT(slot_triggerModeBtn()));connect(ui->startGrabBtn ,SIGNAL(clicked()),this,SLOT(slot_grabbingBtn()));connect(ui->softwareTriggerBtn,SIGNAL(stateChanged(int)),this,SLOT(slot_softwareTriggerBtn()));connect(ui->softwareOnceBtn ,SIGNAL(clicked()),this,SLOT(slot_softwareoOnceBtn()));connect(ui->saveBmpBtn ,SIGNAL(clicked()),this,SLOT(slot_saveBmpBtn()));connect(ui->saveJpgBtn ,SIGNAL(clicked()),this,SLOT(slot_saveJpgBtn()));connect(ui->saveTiffBtn ,SIGNAL(clicked()),this,SLOT(slot_saveTiffBtn()));connect(ui->savePngBtn ,SIGNAL(clicked()),this,SLOT(slot_savePngBtn()));connect(ui->GetParamterBtn ,SIGNAL(clicked()),this,SLOT(slot_getParameterBtn()));connect(ui->SetParameterBtn ,SIGNAL(clicked()),this,SLOT(slot_setParameterBtn()));connect(ui->stopGrabBtn ,SIGNAL(clicked()),this,SLOT(slot_stopGrbbingBtn()));
}void Widget::slot_setParameterBtn()
{bool bIsSetSucceed = true;int nRet = SetExposureTime();if (nRet != MV_OK){bIsSetSucceed = false;QMessageBox::critical(this,"Exposure","Set Exposure Time Fail");}nRet = SetGain();if (nRet != MV_OK){bIsSetSucceed = false;QMessageBox::critical(this,"Gain","Set Gain Fail");}nRet = SetFrameRate();if (nRet != MV_OK){bIsSetSucceed = false;QMessageBox::critical(this,"Frame","Set Frame Rate Fail");}if (true == bIsSetSucceed){QMessageBox::critical(this,"Parameter","Set Parameter Succeed");}
}void Widget::slot_stopGrbbingBtn()
{if (false == m_bOpenDevice || false == m_bStartGrabbing || NULL == m_pcMyCamera){return;}m_WorkThread->SetRun(false);bool f=m_WorkThread->isRun();if(f){m_WorkThread->quit();m_WorkThread->wait();m_WorkThread=NULL;}int nRet = m_pcMyCamera->StopGrabbing();if(MV_OK != nRet){QMessageBox::critical(this,"grabbing","Stop grabbing fail");return;}m_bStartGrabbing = false;
}int Widget::SetTriggerSource()
{int nRet = MV_OK;m_bSoftWareTriggerCheck=ui->softwareTriggerBtn->isChecked();if (m_bSoftWareTriggerCheck){m_nTriggerSource = MV_TRIGGER_SOURCE_SOFTWARE;nRet = m_pcMyCamera->SetEnumValue("TriggerSource", m_nTriggerSource);if (MV_OK != nRet){QMessageBox::critical(this,"Trigger","Set Software Trigger Fail");return nRet;}// GetDlgItem(IDC_SOFTWARE_ONCE_BUTTON )->EnableWindow(TRUE);}else{m_nTriggerSource = MV_TRIGGER_SOURCE_LINE0;nRet = m_pcMyCamera->SetEnumValue("TriggerSource", m_nTriggerSource);if (MV_OK != nRet){QMessageBox::critical(this,"Hardware","Set Hardware Trigger Fail");return nRet;}//GetDlgItem(IDC_SOFTWARE_ONCE_BUTTON )->EnableWindow(FALSE);}return nRet;
}int Widget::SetFrameRate()
{int nRet = m_pcMyCamera->SetBoolValue("AcquisitionFrameRateEnable", true);if (MV_OK != nRet){return nRet;}bool ok;float frameRate = ui->FrameRateLineEdit->text().toDouble(&ok);if (!ok) {// 处理转换失败的情况,可能需要返回错误代码或显示错误消息return -1; // 示例错误代码}return m_pcMyCamera->SetFloatValue("AcquisitionFrameRate", (float)frameRate);
}int Widget::SetGain()
{// 先尝试关闭自动增益m_pcMyCamera->SetEnumValue("GainAuto", 0);bool ok;float gain = ui->GainLineEdit->text().toDouble(&ok);if (!ok) {// 处理转换失败的情况return -1; // 示例错误代码}return m_pcMyCamera->SetFloatValue("Gain", (float)gain);
}int Widget::SetExposureTime()
{int nRet = m_pcMyCamera->SetEnumValue("ExposureMode", MV_EXPOSURE_MODE_TIMED);if (MV_OK != nRet){return nRet;}// 关闭自动曝光m_pcMyCamera->SetEnumValue("ExposureAuto", MV_EXPOSURE_AUTO_MODE_OFF);bool ok;float exposureTime = ui->ExposureLineEdit->text().toDouble(&ok);if (!ok) {// 处理转换失败的情况return -1; // 示例错误代码}return m_pcMyCamera->SetFloatValue("ExposureTime", (float)exposureTime);
}int Widget::SetTriggerMode()
{return m_pcMyCamera->SetEnumValue("TriggerMode", m_nTriggerMode);
}void Widget::slot_getParameterBtn()
{int nRet = GetTriggerMode();if (nRet != MV_OK){QMessageBox::critical(this,"Mode","Get Trigger Mode Fail");}nRet = GetExposureTime();if (nRet != MV_OK){QMessageBox::critical(this,"Mode","Get Exposure Time Fail");}ui->ExposureLineEdit->setText(QString("%1").arg(m_dExposureEdit));nRet = GetGain();if (nRet != MV_OK){QMessageBox::critical(this,"Gain","Get Gain Fail");}ui->GainLineEdit->setText(QString("%1").arg(m_dGainEdit));nRet = GetFrameRate();if (nRet != MV_OK){QMessageBox::critical(this,"Frame","Get Frame Rate Fail");}ui->FrameRateLineEdit->setText(QString("%1").arg(m_dFrameRateEdit));nRet = GetTriggerSource();if (nRet != MV_OK){QMessageBox::critical(this,"Trigger","Get Trigger Source Fail");}}int Widget::GetTriggerSource()
{MVCC_ENUMVALUE stEnumValue = {0};int nRet = m_pcMyCamera->GetEnumValue("TriggerSource", &stEnumValue);if (MV_OK != nRet){return nRet;}if ((unsigned int)MV_TRIGGER_SOURCE_SOFTWARE == stEnumValue.nCurValue){m_bSoftWareTriggerCheck = true;}else{m_bSoftWareTriggerCheck = false;}return MV_OK;
}int Widget::GetGain()
{MVCC_FLOATVALUE stFloatValue = {0};int nRet = m_pcMyCamera->GetFloatValue("Gain", &stFloatValue);if (MV_OK != nRet){return nRet;}m_dGainEdit = stFloatValue.fCurValue;return MV_OK;
}int Widget::GetFrameRate()
{MVCC_FLOATVALUE stFloatValue = {0};int nRet = m_pcMyCamera->GetFloatValue("ResultingFrameRate", &stFloatValue);if (MV_OK != nRet){return nRet;}m_dFrameRateEdit = stFloatValue.fCurValue;return MV_OK;
}int Widget::GetTriggerMode()
{MVCC_ENUMVALUE stEnumValue = {0};int nRet = m_pcMyCamera->GetEnumValue("TriggerMode", &stEnumValue);if(MV_OK != nRet){return nRet;}m_nTriggerMode = stEnumValue.nCurValue;EnableControls();return MV_OK;
}int Widget::GetExposureTime()
{MVCC_FLOATVALUE stFloatValue = {0};int nRet = m_pcMyCamera->GetFloatValue("ExposureTime", &stFloatValue);if(MV_OK != nRet){return nRet;}m_dExposureEdit = stFloatValue.fCurValue;return MV_OK;
}void Widget::slot_savePngBtn()
{int nRet = SaveImage(MV_Image_Png);if (MV_OK != nRet){QMessageBox::critical(this,"picture","Save Png fail");return;}QMessageBox::critical(this,"picture","Save Png succeed!");
}void Widget::slot_saveTiffBtn()
{int nRet = SaveImage(MV_Image_Tif);if (MV_OK != nRet){QMessageBox::critical(this,"picture","Save jpg fail");return;}QMessageBox::critical(this,"picture","Save jpg succeed!");
}void Widget::slot_saveJpgBtn()
{int nRet = SaveImage(MV_Image_Jpeg);if (MV_OK != nRet){QMessageBox::critical(this,"picture","Save jpg fail");return;}QMessageBox::critical(this,"picture","Save jpg succeed!");
}int Widget::SaveImage(MV_SAVE_IAMGE_TYPE enSaveImageType)
{MV_SAVE_IMG_TO_FILE_PARAM stSaveFileParam;memset(&stSaveFileParam, 0, sizeof(MV_SAVE_IMG_TO_FILE_PARAM));m_mutex.lock();if (m_pSaveImageBuf == NULL || m_stImageInfo.enPixelType == 0){m_mutex.unlock();return MV_E_NODATA;}if(RemoveCustomPixelFormats(m_stImageInfo.enPixelType)){m_mutex.unlock();return MV_E_SUPPORT;}stSaveFileParam.enImageType = enSaveImageType; // ch:需要保存的图像类型 | en:Image format to savestSaveFileParam.enPixelType = m_stImageInfo.enPixelType; // ch:相机对应的像素格式 | en:Camera pixel typestSaveFileParam.nWidth = m_stImageInfo.nWidth; // ch:相机对应的宽 | en:WidthstSaveFileParam.nHeight = m_stImageInfo.nHeight; // ch:相机对应的高 | en:HeightstSaveFileParam.nDataLen = m_stImageInfo.nFrameLen;stSaveFileParam.pData = m_pSaveImageBuf;stSaveFileParam.iMethodValue = 0;// ch:jpg图像质量范围为(50-99], png图像质量范围为[0-9] | en:jpg image nQuality range is (50-99], png image nQuality range is [0-9]if (MV_Image_Bmp == stSaveFileParam.enImageType){sprintf_s(stSaveFileParam.pImagePath, 256, "Image_w%d_h%d_fn%03d.bmp", stSaveFileParam.nWidth, stSaveFileParam.nHeight, m_stImageInfo.nFrameNum);}else if (MV_Image_Jpeg == stSaveFileParam.enImageType){stSaveFileParam.nQuality = 80;sprintf_s(stSaveFileParam.pImagePath, 256, "Image_w%d_h%d_fn%03d.jpg", stSaveFileParam.nWidth, stSaveFileParam.nHeight, m_stImageInfo.nFrameNum);}else if (MV_Image_Tif == stSaveFileParam.enImageType){sprintf_s(stSaveFileParam.pImagePath, 256, "Image_w%d_h%d_fn%03d.tif", stSaveFileParam.nWidth, stSaveFileParam.nHeight, m_stImageInfo.nFrameNum);}else if (MV_Image_Png == stSaveFileParam.enImageType){stSaveFileParam.nQuality = 8;sprintf_s(stSaveFileParam.pImagePath, 256, "Image_w%d_h%d_fn%03d.png", stSaveFileParam.nWidth, stSaveFileParam.nHeight, m_stImageInfo.nFrameNum);}int nRet = m_pcMyCamera->SaveImageToFile(&stSaveFileParam);m_mutex.unlock();return nRet;
}void Widget::slot_saveBmpBtn()
{int nRet = SaveImage(MV_Image_Bmp);if (MV_OK != nRet){QMessageBox::critical(this,"picture","Save bmp fail");return;}QMessageBox::critical(this,"picture","Save bmp succeed!");
}void Widget::slot_closeDevice()
{bool f=m_WorkThread->isRun();if (f){m_WorkThread->quit();m_WorkThread->wait();m_WorkThread->SetRun(false);}if(m_pcMyCamera){m_pcMyCamera->Close();delete m_pcMyCamera;m_pcMyCamera = NULL;}m_bStartGrabbing=false;m_bOpenDevice = false;if(m_pSaveImageBuf){free(m_pSaveImageBuf);m_pSaveImageBuf=NULL;}m_nSaveImageBufSize=0;EnableControls();
}void Widget::slot_continusModeBtn()
{m_nTriggerMode = MV_TRIGGER_MODE_OFF;m_pcMyCamera->SetEnumValue("TriggerMode", m_nTriggerMode);EnableControls();
}void Widget::slot_triggerModeBtn()
{m_nTriggerMode = MV_TRIGGER_MODE_ON;m_pcMyCamera->SetEnumValue("TriggerMode", m_nTriggerMode);EnableControls();
}void Widget::slot_grabbingBtn()
{if (false == m_bOpenDevice || true == m_bStartGrabbing || NULL == m_pcMyCamera){return;}memset(&m_stImageInfo, 0, sizeof(MV_FRAME_OUT_INFO_EX));m_WorkThread->SetRun(true);m_WorkThread->start();int nRet = m_pcMyCamera->StartGrabbing();if (MV_OK != nRet){m_WorkThread->SetRun(false);QMessageBox::information(this,"Device","Start grabbing fail");return;}m_bStartGrabbing = true;EnableControls();
}void Widget::slot_softwareTriggerBtn()
{int nRet = MV_OK;m_bSoftWareTriggerCheck=ui->softwareTriggerBtn->isChecked();if (m_bSoftWareTriggerCheck){m_nTriggerSource = MV_TRIGGER_SOURCE_SOFTWARE;nRet = m_pcMyCamera->SetEnumValue("TriggerSource", m_nTriggerSource);if (MV_OK != nRet){QMessageBox::information(this,"Device","Set Software Trigger Fail");return;}}else{m_nTriggerSource = MV_TRIGGER_SOURCE_LINE0;nRet = m_pcMyCamera->SetEnumValue("TriggerSource", m_nTriggerSource);if (MV_OK != nRet){QMessageBox::information(this,"Device","Set Hardware Trigger Fail");return;}}EnableControls();return;
}void Widget::slot_softwareoOnceBtn()
{if(true != m_bStartGrabbing){return;}m_pcMyCamera->CommandExecute("TriggerSoftware");
}void Widget::InitUi()
{memset(&m_stImageInfo, 0, sizeof(MV_FRAME_OUT_INFO_EX));m_WorkThread->SetRun(false);EnableControls();
}void Widget::EnableControls()
{//如果查询到设备,开启打开设备按钮ui->openDeviceBtn->setEnabled(m_isDeviceReady?true:false);ui->closeDeviceBtn->setEnabled(m_bOpenDevice?true:false);ui->continusModeBtn->setEnabled(m_bOpenDevice?true:false);ui->triggerModeBtn->setEnabled(m_bOpenDevice?true:false);ui->startGrabBtn->setEnabled(m_bOpenDevice?true:false);ui->stopGrabBtn->setEnabled(m_bOpenDevice?true:false);//首先是否是在采集图像中,在采集图像的过程中,判断是否为触发模式,只有在触发模式下,才能开启软触发按钮。ui->softwareTriggerBtn->setEnabled(m_bStartGrabbing?((MV_TRIGGER_MODE_ON == m_nTriggerMode)?true:false):false);ui->softwareOnceBtn->setEnabled((MV_TRIGGER_MODE_OFF == m_nTriggerMode) ? false:(m_bSoftWareTriggerCheck?true:false) );ui->saveBmpBtn->setEnabled(m_bStartGrabbing?true:false);ui->saveJpgBtn->setEnabled(m_bStartGrabbing?true:false);ui->saveTiffBtn->setEnabled(m_bStartGrabbing?true:false);ui->savePngBtn->setEnabled(m_bStartGrabbing?true:false);ui->GetParamterBtn->setEnabled(m_bOpenDevice?true:false);ui->SetParameterBtn ->setEnabled(m_bOpenDevice?true:false);ui->ExposureLineEdit->setEnabled(m_bOpenDevice?true:false);ui->GainLineEdit->setEnabled(m_bOpenDevice?true:false);ui->FrameRateLineEdit->setEnabled(m_bOpenDevice?true:false);
}bool Widget::RemoveCustomPixelFormats(MvGvspPixelType enPixelFormat)
{int nResult = enPixelFormat & MV_GVSP_PIX_CUSTOM;if(MV_GVSP_PIX_CUSTOM == nResult){return true;}else{return false;}
}void Widget::slot_openDevice()
{if (true == m_bOpenDevice || NULL != m_pcMyCamera){return;}int nIndex = m_nDeviceCombo;if ((nIndex < 0) | (nIndex >= MV_MAX_DEVICE_NUM)){QMessageBox::critical(this,"Device","Device index is error!");return;}// ch:由设备信息创建设备实例 | en:Device instance created by device informationif (NULL == m_stDevList.pDeviceInfo[nIndex]){QMessageBox::critical(this,"Device","Device does not exist!");return;}m_pcMyCamera = new CMvCamera;if (NULL == m_pcMyCamera){return;}int nRet = m_pcMyCamera->Open(m_stDevList.pDeviceInfo[nIndex]);if (MV_OK != nRet){delete m_pcMyCamera;m_pcMyCamera = NULL;QMessageBox::critical(this,"Device","Device Open error!");return;}// ch:探测网络最佳包大小(只对GigE相机有效) | en:Detection network optimal package size(It only works for the GigE camera)if (m_stDevList.pDeviceInfo[nIndex]->nTLayerType == MV_GIGE_DEVICE){unsigned int nPacketSize = 0;nRet = m_pcMyCamera->GetOptimalPacketSize(&nPacketSize);if (nRet == MV_OK){nRet = m_pcMyCamera->SetIntValue("GevSCPSPacketSize",nPacketSize);if(nRet != MV_OK){QMessageBox::critical(this,"Device","Warning: Set Packet Size fail!");}}else{QMessageBox::critical(this,"Device","Warning: Get Packet Size fail!");}}m_bOpenDevice = true;EnableControls();slot_getParameterBtn();
}void Widget::slot_searchDevice()
{QString strMsg;ui->comboBox->clear();memset(&m_stDevList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));//ch:枚举子网内所有设备,将查询到的设备信息保存到m_stDevList列表中。int nRet = CMvCamera::EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &m_stDevList);if (MV_OK != nRet){QMessageBox::critical(this,"device","No device!");return;}// ch:将值加入到信息列表框中并显示出来 | en:Add value to the information list box and displayfor (unsigned int i = 0; i < m_stDevList.nDeviceNum; i++){MV_CC_DEVICE_INFO* pDeviceInfo = m_stDevList.pDeviceInfo[i];if (NULL == pDeviceInfo){continue;}if (pDeviceInfo->nTLayerType == MV_USB_DEVICE){char strUserName[256] = {0};sprintf_s(strUserName, 256, "%s %s (%s)", pDeviceInfo->SpecialInfo.stUsb3VInfo.chModelName,pDeviceInfo->SpecialInfo.stUsb3VInfo.chModelName,pDeviceInfo->SpecialInfo.stUsb3VInfo.chSerialNumber);QString UserName(strUserName);QString strMsg = QString("USB %1").arg(QString::fromUtf8(reinterpret_cast<const char*>(pDeviceInfo->SpecialInfo.stUsb3VInfo.chSerialNumber)));ui->comboBox->addItem(strMsg);}}if (0 == m_stDevList.nDeviceNum){QMessageBox::critical(this,"device","No device!");return;}ui->comboBox->setCurrentIndex(0);m_isDeviceReady=true; //设备已经打开EnableControls();
}Widget::~Widget()
{delete ui;slot_closeDevice();
}
相关文章:

海康威视相机在QTcreate上的使用教程
文章目录 前言:基础夯实:效果展示:图片展示:视频展示: 参考的资料:遇到问题:问题1:int64 does not问题2:LNK2019配置思路(这个很重要)配置关键图片:配置具体过…...

进程状态、进程创建和进程分类
文章目录 进程进程常见的状态进程调度进程状态变化关系 进程标识示例--进程标识的使用以及简介 进程创建fork函数vfork函数示例--使用fork函数创建子进程,并了解进程之间的关系 创建进程时发生的变化虚拟内存空间的变化示例--验证fork函数创建进程时的操作 对文件IO…...
java后端请求调用三方接口
java后端请求调用三方接口 /*** param serverURL http接口地址(例:http://www.iwsu.top:8016/dataSyn/bay/statsCar)* param parm 参数(可以是json,也可以是json数组)*/ public void doRestfulPostBody(St…...
C#使用TCP-S7协议读写西门子PLC(三)
接上篇 C#使用TCP-S7协议读写西门子PLC(二)-CSDN博客 这里我们进行封装读写西门子PLC的S7协议命令以及连接西门子PLC并两次握手 新建部分类文件SiemensS7ProtocolUtil.ReadWrite.cs 主要方法: 连接西门子PLC并发送两次握手。两次握手成功后,才真正连…...

铝型材及其常用紧固件、连接件介绍
铝型材介绍(包括紧固件和连接件以及走线) 铝型材 铝型材一般是6063铝合金挤压成型,分为欧标和国标两个标准。(左边国标,右边欧标,欧标槽宽一点) 由于槽型不一样,相关的螺栓和螺母也…...
【裸机装机系列】7.kali(ubuntu)-安装开发所需工具
如果你是后端或是人工智能AI岗,可以安装以下推荐的软件: 1> sublime sublime官网 下载deb文件 安装命令 sudo dpkg -i sublime-text_build-4143_amd64.deb2> vscode 安装前置软件 sudo apt install curl gpg software-properties-common apt-t…...

[C语言]第九节 函数一基础知识到高级技巧的全景探索
目录 9.1 函数的概念 9.2 库函数 9.2.1 标准库与库函数 示例:常见库函数 9.2.2 标准库与头文件的关系 参考资料和学习工具 如何使用库函数 编辑 9.3 ⾃定义函数 9.3.1 函数的语法形式 9.3.2函数的举例 9.4 实参与形参 9.4.1 什么是实参? 9…...

1.1 计算机网络基本概述
欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅! 文章目录 前言一、网络的基本概念二、集线器、交换机和路由器三、互连网与互联网四、网络的类型五、互连网的组成1. 边缘部分2. 核心部分 六、网络协议 前言 计算机网络是现代信息社会…...

Linux环境基础开发工具使用(gcc/g++与makefile)
1.Linux编译器-gcc/g使用 1. 背景知识 接下来的操作,我以gcc为例,因为两者选项都是通用的,所以也就相当于间接学习了 1.预处理(进行宏替换) 2.编译(生成汇编) 3.汇编(生成机器可识别代码)…...

PointNet++改进策略 :模块改进 | EdgeConv | DGCNN, 动态图卷积在3d任务上应用
目录 介绍核心思想及其实现核心思想实现步骤 如何改进PointNet**局部几何结构的处理****动态图的引入****特征聚合的灵活性****全局和局部特征的结合** 论文题目:Dynamic Graph CNN for Learning on Point Clouds发布期刊:TOG作者单位:麻省理…...
FFmpeg源码:skip_bits、skip_bits1、show_bits函数分析
GetBitContext结构体和其相关的函数分析: FFmpeg中位操作相关的源码:GetBitContext结构体,init_get_bits函数、get_bits1函数和get_bits函数分析 FFmpeg源码:skip_bits、skip_bits1、show_bits函数分析 一、skip_bits函数 skip…...

加密
一、加密 加密运算需要两个输入:密钥和明文 解密运算也需要两个输入:密钥和密文 密文通常看起来都是晦涩难懂、毫无逻辑的,所以我们一般会通过传输或者存储密文来保护私密数据,当然,这建立在一个基础上,…...

Kibana:如何使用魔法公式创建具有影响力的可视化效果?(第 1 部分)
作者:来自 Elastic Vincent du Sordet 我们将看到 Kibana Lens 编辑器中的神奇数学公式如何帮助突出显示高值。 简介 在上一篇博文《作为非设计师设计直观的 Kibana 仪表板》中,我们强调了创建直观仪表板的重要性。它展示了简单的更改(分组…...

【C++】多态and多态原理
目录 一、多态的概念 二、多态的定义及实现 🌟多态的构成条件 🌟虚函数 🌟虚函数的重写 🌠小贴士: 🌟C11 override 和 final 🌟重载、重写(覆盖)、重定义…...

C# 实现二维数据数组导出到 Excel
目录 功能需求 范例运行环境 Excel DCOM 配置 设计实现 组件库引入 编辑 方法设计 生成二维数据数组 核心方法实现 调用示例 总结 功能需求 将数据库查询出来的数据导出并生成 Excel 文件,是项目中经常使用的一项功能。本文将介绍通过数据集生成二维…...
nlohmann::json中有中文时调用dump转string抛出异常的问题
问题描述 Winodows下C开发想使用一个json库,使用的nlohmann::json,但是遇到json中使用中文时,转成string,会抛出异常。 nlohmann::json contentJson;contentJson["chinese"] "哈哈哈";std::string test con…...

Unity中InputField一些属性的理解
先看代码: using UnityEngine; using UnityEngine.UI;public class TestInput : MonoBehaviour {[SerializeField]InputField inputField;void Start(){Debug.Log(inputField.text);Debug.Log(inputField.text.Length);Debug.Log(inputField.preferredWidth);Debug…...

【webpack4系列】webpack构建速度和体积优化策略(五)
文章目录 速度分析:使用 speed-measure-webpack-plugin体积分析:使用webpack-bundle-analyzer使用高版本的 webpack 和 Node.js多进程/多实例构建资源并行解析可选方案使用 HappyPack 解析资源使用 thread-loader 解析资源 多进程并行压缩代码方法一&…...
从零开始搭建 PHP
🛠️ 从零开始搭建 PHP 环境:详细教程 PHP(Hypertext Preprocessor)是最流行的后端脚本语言之一,广泛用于构建动态网站和 Web 应用程序。在开始 PHP 开发之前,首先需要搭建 PHP 运行环境。无论你使用的是 …...

【数据结构】8——图3,十字链表,邻接多重表
数据结构8——图3,十字链表,邻接多重表 文章目录 数据结构8——图3,十字链表,邻接多重表前言一、十字链表结构例子 复杂例子 二、邻接多重表(Adjacency Multilist)例子 前言 除了之前的邻接矩阵和邻接表 …...

【CUDA 】第5章 共享内存和常量内存——5.3减少全局内存访问(2)
CUDA C编程笔记 第五章 共享内存和常量内存5.3 减少全局内存访问5.3.2 使用展开的并行规约思路reduceSmemUnroll4(共享内存)具体代码:运行结果意外发现书上全局加载事务和全局存储事务和ncu中这两个值相同 5.3.3 动态共享内存的并行规约reduc…...
如何确定微服务的粒度与边界
确定微服务的粒度与边界 在完成初步服务拆分之后,架构师往往会遇到另一个难题:该拆到多细?哪些功能可以归并为一个服务,哪些又必须单独部署?这就是“服务粒度与边界”的问题。本节将围绕实际架构经验,介绍…...

从webrtc到janus简介
1.基础知识 1.1 信令的基础知识 在 WebRTC(Web Real-Time Communication) 中,信令(Signaling) 是实现浏览器之间实时通信的关键机制,负责在通信双方(或多方)之间传递控制信息&…...

iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆栈溢出
在vue项目中使用iview 框架部分组件时,直接引入使用报Maximum call stack size exceeded image.png 堆栈溢出 解决方案 更换组件名称就可以了 image.png 或 image.png 就可以了 猜测是因为和vue自己提供的组件名称一致了,重名问题导致的,具体…...

ModuleNotFoundError No module named ‘torch_geometric‘未找到
ModuleNotFoundError: No module named torch_geometric’未找到 试了很多方法,都没成功,安装torch对应版本的torch_geometric都不行, 后来发现是pip被设置了环境变量,所有pip文件都给安装在了一个文件夹了 排查建议 1. 检查 p…...

A Execllent Software Project Review and Solutions
The Phoenix Projec: how do we produce software? how many steps? how many people? how much money? you will get it. i am a pretty judge of people…a prank...
基于对比学习的带钢表面缺陷分类研究,整合SimCLR自监督预训练与YOLOv8目标检测框架的技术解析及Python实现方案
以下基于对比学习的带钢表面缺陷分类研究,整合SimCLR自监督预训练与YOLOv8目标检测框架的技术解析及Python实现方案: 基于对比学习的带钢表面缺陷分类研究 ——SimCLR与YOLOv8算法融合应用 #mermaid-svg-VqDPIOfR5WJcGtD7 {font-family:"trebuchet ms",verdana,ar…...
bat批量去掉本文件夹中的文件扩展名
本文本夹内 批量去掉本文件夹中的文件扩展名 假如你有一些文件,你想去掉他们的扩展名 有没有方便的办法呢 今天我们就分享一种办法。 下面,就来看看吧。 首先我们新建一个记事本,把名字改为,批量去掉本文件夹中的文件扩展名.txt 然…...
第1章:Neo4j简介与图数据库基础
1.1 图数据库概述 在当今数据爆炸的时代,数据不仅仅是以量取胜,更重要的是数据之间的关联关系。传统的关系型数据库在处理高度关联数据时往往力不从心,而图数据库则应运而生,成为处理复杂关联数据的理想选择。 传统关系型数据库…...
十一、【ESP32开发全栈指南: TCP通信服务端】
一、TCP与UDP协议对比 1.1 基本特性比较 TCP(传输控制协议)和UDP(用户数据报协议)是两种最常用的传输层协议,它们在ESP32网络编程中都有广泛应用: 连接方式 TCP是面向连接的协议,通信前需要先建立连接(三次握手)UDP是无连接的协议ÿ…...