海康相机opencv,C++调用demo配置记录

devtools/2024/9/25 12:33:26/

opencvCdemo_0">海康相机opencv,C++调用demo配置记录

配置:1.Opencv4.6.0
2.MVS
3.Vs2019

第一章、相关文件

一、demo文件

在安装好mvs后,相应文件夹中,会有样例文件。默认安装mvs的话,文件在目录:

C:\Program Files (x86)\MVS\Development

在这里插入图片描述
Documentations:一些配置教程文档文件,可以参考一下
Samples:一些样例demo
将Samples文件夹下的OpenCV文件夹拷贝出来。
在这里插入图片描述

二、依赖文件

将MvCameraControl.lib和MvCameraControl.h文件拷贝到工程目录下。注意MvCameraControl.lib文件有32位和64位两种,根据自己的工程进行选择。
在这里插入图片描述

第二章、修改demo代码

Samples中opencv的RawDataFormatConvert.cpp代码是使用OPencv3和vs2008编写的,其中一些调用接口改变了。需要进行修改,修改后的RawDataFormatConvert.cpp代码如下:

#include "MvCameraControl.h"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <stdio.h>
#include <Windows.h>
#include <process.h>
#include <conio.h>
#include <string.h>unsigned int g_nPayloadSize = 0;enum CONVERT_TYPE
{OpenCV_Mat        = 0,    // Most of the time, we use 'Mat' format to store image data after OpenCV V2.1OpenCV_IplImage   = 1,    // Deprecated: we may also use 'IplImage' format to store image data, usually before OpenCV V2.1
};// Wait for key press
void WaitForKeyPress(void)
{while(!_kbhit()){Sleep(10);}_getch();
}// print the discovered devices information to user
bool 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);// print current ip and user defined nameprintf("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("UserDefinedName: %s\n", pstMVDevInfo->SpecialInfo.stUsb3VInfo.chUserDefinedName);printf("Serial Number: %s\n", pstMVDevInfo->SpecialInfo.stUsb3VInfo.chSerialNumber);printf("Device Number: %d\n\n", pstMVDevInfo->SpecialInfo.stUsb3VInfo.nDeviceNumber);}else{printf("Not support.\n");}return true;
}int RGB2BGR( unsigned char* pRgbData, unsigned int nWidth, unsigned int nHeight )
{if ( NULL == pRgbData ){return MV_E_PARAMETER;}for (unsigned int j = 0; j < nHeight; j++){for (unsigned int i = 0; i < nWidth; i++){unsigned char red = pRgbData[j * (nWidth * 3) + i * 3];pRgbData[j * (nWidth * 3) + i * 3]     = pRgbData[j * (nWidth * 3) + i * 3 + 2];pRgbData[j * (nWidth * 3) + i * 3 + 2] = red;}}return MV_OK;
}// convert data stream in Mat format
bool Convert2Mat(MV_FRAME_OUT_INFO_EX* pstImageInfo, unsigned char * pData)
{cv::Mat srcImage;if ( pstImageInfo->enPixelType == PixelType_Gvsp_Mono8 ){srcImage = cv::Mat(pstImageInfo->nHeight, pstImageInfo->nWidth, CV_8UC1, pData);}else if ( pstImageInfo->enPixelType == PixelType_Gvsp_RGB8_Packed ){RGB2BGR(pData, pstImageInfo->nWidth, pstImageInfo->nHeight);srcImage = cv::Mat(pstImageInfo->nHeight, pstImageInfo->nWidth, CV_8UC3, pData);}else{printf("unsupported pixel format\n");return false;}if ( NULL == srcImage.data ){return false;}//save converted image in a local filetry {cv::imwrite("MatImage.bmp", srcImage);}catch (cv::Exception& ex) {fprintf(stderr, "Exception saving image to bmp format: %s\n", ex.what());}srcImage.release();return true;
}// convert data stream in Ipl format (deprecated)
bool Convert2Ipl(MV_FRAME_OUT_INFO_EX* pstImageInfo, unsigned char * pData)
{cv::Mat srcImage;if ( pstImageInfo->enPixelType == PixelType_Gvsp_Mono8 ){srcImage = cv::Mat(pstImageInfo->nHeight, pstImageInfo->nWidth, CV_8UC1, pData);}else if ( pstImageInfo->enPixelType == PixelType_Gvsp_RGB8_Packed ){RGB2BGR(pData, pstImageInfo->nWidth, pstImageInfo->nHeight);srcImage = cv::Mat(pstImageInfo->nHeight, pstImageInfo->nWidth, CV_8UC3, pData);}else{printf("unsupported pixel format\n");return false;}if ( NULL == srcImage.data ){return false;}// save converted image in a local filetry {cv::imwrite("IplImage.bmp", srcImage);}catch (cv::Exception& ex) {fprintf(stderr, "Exception saving image to bmp format: %s\n", ex.what());}srcImage.release();return true;
}int main()
{int nRet = MV_OK;void* handle = NULL;do{// Enum deviceMV_CC_DEVICE_INFO_LIST stDeviceList;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("Enum Devices fail! nRet [0x%x]\n", nRet);break;}if (stDeviceList.nDeviceNum > 0){for (unsigned int i = 0; i < stDeviceList.nDeviceNum; i++){printf("[device %d]:\n", i);MV_CC_DEVICE_INFO* pDeviceInfo = stDeviceList.pDeviceInfo[i];if (NULL == pDeviceInfo){break;}PrintDeviceInfo(pDeviceInfo);}}else{printf("Find No Devices!\n");break;}// input the format to convertprintf("[0] OpenCV_Mat\n");printf("[1] OpenCV_IplImage (deprecated)\n");printf("Please Input Format to convert:");unsigned int nFormat = 0;scanf("%d", &nFormat);if (nFormat >= 2){printf("Input error!\n");return 0;}// select device to connectprintf("Please Input camera index(0-%d):", stDeviceList.nDeviceNum-1);unsigned int nIndex = 0;scanf("%d", &nIndex);if (nIndex >= stDeviceList.nDeviceNum){printf("Input error!\n");break;}// Select device and create handlenRet = MV_CC_CreateHandle(&handle, stDeviceList.pDeviceInfo[nIndex]);if (MV_OK != nRet){printf("Create Handle fail! nRet [0x%x]\n", nRet);break;}// open devicenRet = MV_CC_OpenDevice(handle);if (MV_OK != nRet){printf("Open Device fail! nRet [0x%x]\n", nRet);break;}// 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]!", nRet);}}else{printf("Warning: Get Packet Size fail nRet [0x%x]!", nPacketSize);}}// Set trigger mode as offnRet = MV_CC_SetEnumValue(handle, "TriggerMode", 0);if (MV_OK != nRet){printf("Set Trigger Mode fail! nRet [0x%x]\n", nRet);break;}// Get payload sizeMVCC_INTVALUE stParam;memset(&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);break;}g_nPayloadSize = stParam.nCurValue;// Start grab imagenRet = MV_CC_StartGrabbing(handle);if (MV_OK != nRet){printf("Start Grabbing fail! nRet [0x%x]\n", nRet);break;}MV_FRAME_OUT_INFO_EX stImageInfo = {0};memset(&stImageInfo, 0, sizeof(MV_FRAME_OUT_INFO_EX));unsigned char * pData = (unsigned char *)malloc(sizeof(unsigned char) * (g_nPayloadSize));if (pData == NULL){printf("Allocate memory failed.\n");break;}// get one frame from camera with timeout=1000msnRet = MV_CC_GetOneFrameTimeout(handle, pData, g_nPayloadSize, &stImageInfo, 1000);if (nRet == MV_OK){printf("Get One Frame: Width[%d], Height[%d], nFrameNum[%d]\n", stImageInfo.nWidth, stImageInfo.nHeight, stImageInfo.nFrameNum);}else{printf("No data[0x%x]\n", nRet);free(pData);pData = NULL;break;}// Convert imagebool bConvertRet = false;if ( 0 == nFormat ){bConvertRet = Convert2Mat(&stImageInfo, pData);}else{bConvertRet = Convert2Ipl(&stImageInfo, pData);}// print resultif ( bConvertRet ){printf("OpenCV format convert finished.\n");free(pData);pData = NULL;}else{printf("OpenCV format convert failed.\n");free(pData);pData = NULL;break;}// Stop grab imagenRet = MV_CC_StopGrabbing(handle);if (MV_OK != nRet){printf("Stop Grabbing fail! nRet [0x%x]\n", nRet);break;}// Close devicenRet = MV_CC_CloseDevice(handle);if (MV_OK != nRet){printf("Close Device fail! nRet [0x%x]\n", nRet);break;}// Destroy handlenRet = MV_CC_DestroyHandle(handle);if (MV_OK != nRet){printf("Destroy Handle fail! nRet [0x%x]\n", nRet);break;}} while (0);if (nRet != MV_OK){if (handle != NULL){MV_CC_DestroyHandle(handle);handle = NULL;}}printf("Press a key to exit.\n");WaitForKeyPress();return 0;
}

第三章、配置Opencv库

opencv_386">一、opencv属性配置

属性管理器中,新建opencv属性,然后添加如下;
1.VC++目录----包含目录
在这里插入图片描述
2.VC++目录----库目录
在这里插入图片描述
3.链接器-----输入------附件依赖项
在这里插入图片描述

二、删除部分属性

在选中Debug|x64后右击鼠标,选择属性,在链接器-------输入--------附加依赖项中删除所有的老版本opencv的配置,只需要保留MvCameraControl.lib
在这里插入图片描述
运行Demo即可看到
在这里插入图片描述


http://www.ppmy.cn/devtools/99232.html

相关文章

neo4j+es知识库管理系统(源码)

一、项目介绍 一款全源码&#xff0c;可二开&#xff0c;可基于云部署、私有部署的企业级知识库云平台&#xff0c;一款让企业知识变为实打实的数字财富的系统&#xff0c;应用在需要进行文档整理、分类、归集、检索、分析的场景。 为什么建立知识库平台&#xff1f; 助力企业…

二叉树的链式存储(代码实现)

二叉树的链式存储 用链表实现&#xff0c;基于完全二叉树规律来构建树&#xff0c;按照完全二叉树的编号方法&#xff0c;从上到下&#xff0c;从左到右。一共n个节点。 第i个节点&#xff1a; 左子节点编号&#xff1a;2*i &#xff08;2*i<n&#xff09; 右子节点编号&…

【深度分析】从《黑神话:悟空》看国产游戏的出海之路

8月20日&#xff0c;中国3A游戏《黑神话&#xff1a;悟空》正式上线并全球发行。正式发布后不到一小时&#xff0c;《黑神话&#xff1a;悟空》就超越《CS2》成为Steam&#xff08;全球最大的综合性数字发行平台之一&#xff09;最受欢迎游戏排行榜冠军&#xff0c;同时在线玩家…

你真的应该弄清楚 URI 和 URL 的区别

目录 什么是 URI&#xff1f; 什么是 URL&#xff1f; URI 和 URL 的区别 小结 在互联网上&#xff0c;我们经常需要引用资源的位置来访问对应的资源。为了实现这一点&#xff0c;有两个术语经常被提及&#xff1a;URI 和 URL。这两个术语很容易也经常被弄混&#xff0c;很…

LeetCode.55.跳跃游戏(贪心算法思路)

题目描述&#xff1a; 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 输…

【Qt】常见控件 —— QWidget

文章目录 QWidget 的基本介绍QWidget 的 enable 属性QWidget 的 geometry属性 QWidget 的基本介绍 Qt 中 的 各种控件 都继承自 QWidget类 在 Qt designer 右侧 就显示出 QWidget的各种属性 并且也可以直接进行编辑 QWidget 的 enable 属性 enable 描述一个控件是否处于可用 …

对数据治理和云采用的思考:过去和现在

组织在向云服务转变的过程中面临数据治理复杂性和挑战。 如今&#xff0c;到了 2024 年&#xff0c;形势已经发生了变化&#xff0c;但根本问题却愈演愈烈。 数据的增长以及网络攻击的频率和复杂性不断增加&#xff0c;使得对强大的数据治理和安全的需求比以往任何时候都更加…

linux安装kibana

上一篇文章安装elasticsearch用的是wget下载的&#xff0c;这篇kibana是rpm 官方文档官方文档链接 下载并安装公共签名密钥&#xff1a; rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch在/etc/yum.repos.d/ 创建kibana.repo文件&#xff0c;写入 [kiban…