海康工业相机拍照代码(2)

本代码实现海康工业相机拍照并保存功能(MV_CC_SaveImageToFile)。
参考:MVS/MVS/Development/Documentations/海康工业相机SDK使用手册.chm

  • C接口定义
    • 图像处理
      • MV_CC_SaveImageToFile
/*
2020/2/19  Vivi
2020/3/05  Update
*/

//#define _CRT_SECURE_NO_DEPRECATE

#include "MvCameraControl.h"
#include <stdio.h>
#include <Windows.h>
#include <conio.h>
#include <iostream> 

using namespace std;

//#param warning(disable:4996)

void main()
{
    unsigned int nTestFrameSize = 0;

	int nRet = -1;
    //枚举子网内指定的传输协议对应的所有设备
    unsigned int nTLayerType = MV_GIGE_DEVICE | MV_USB_DEVICE;
    MV_CC_DEVICE_INFO_LIST m_stDevList = { 0 };            // 初始化 m_stDevList
    nRet = MV_CC_EnumDevices(nTLayerType, &m_stDevList);   // m_stDevList 为相机设备数量


    while (1)
    {
        if (nTestFrameSize > 19)
            break;



        for (int nDeviceIndex = 0; nDeviceIndex < m_stDevList.nDeviceNum; nDeviceIndex++)   // 按第 0、1 个相机走流程
        {
			nRet = -1;
			void* m_handle = NULL;

			//选择查找到的在线设备,创建设备句柄
			MV_CC_DEVICE_INFO m_stDevInfo = { 0 };   // 初始化一台设备(m_stDevInfo)

			memcpy(&m_stDevInfo, m_stDevList.pDeviceInfo[nDeviceIndex], sizeof(MV_CC_DEVICE_INFO));    // 复制设备地址

			cout << "设备地址: " << m_stDevList.pDeviceInfo[nDeviceIndex] << endl;

			nRet = MV_CC_CreateHandle(&m_handle, &m_stDevInfo);                                        // 按顺序创建句柄

            if (MV_OK != nRet)
            {
                printf("error: CreateHandle fail [%x]\n", nRet);
                return;
            }
            //连接设备
            nRet = MV_CC_OpenDevice(m_handle);
            if (MV_OK != nRet)
            {
                printf("error: OpenDevice fail [%x]\n", nRet);
                return;
            }
            // 设置连续模式
            unsigned int enMode = MV_TRIGGER_MODE_OFF; //关闭触发源
            nRet = MV_CC_SetEnumValue(m_handle, "TriggerMode", enMode);
            if (MV_OK != nRet)
            {
                printf("error: Trigger mode off fail [%x]\n", nRet);
                return;
            }
            /* 设置自动曝光
                0 : Off
                1 : Once
                2 :Continuous  */
            nRet = MV_CC_SetEnumValue(m_handle, "ExposureAuto", 2);
            if (MV_OK != nRet)
            {
                printf("error: Exposure auto fail [%x]\n", nRet);
                return;
            }
            /* 设置自动增益
               0 : Off
               1 : Once
               2 :Continuous  */
            nRet = MV_CC_SetEnumValue(m_handle, "GainAuto", 2);
            if (MV_OK != nRet)
            {
                printf("error: Gain auto fail [%x]\n", nRet);
                return;
            }
            /* 设置自动白平衡
               0 : Off
               2 : Once
               1 :Continuous  */
            nRet = MV_CC_SetEnumValue(m_handle, "BalanceWhiteAuto", 1);
            if (MV_OK != nRet)
            {
                printf("error: Balance white auto fail [%x]\n", nRet);
                return;
            }
            //...其他处理

            //开始采集图像
            nRet = MV_CC_StartGrabbing(m_handle);
            if (MV_OK != nRet)
            {
                printf("error: StartGrabbing fail [%x]\n", nRet);
                return;
            }
            //获取一帧数据的大小
            MVCC_INTVALUE stIntvalue = { 0 };
            nRet = MV_CC_GetIntValue(m_handle, "PayloadSize", &stIntvalue);
            if (nRet != MV_OK)
            {
                printf("failed in get PayloadSize [%x]\n", nRet);
                return;
            }
            int nBufSize = stIntvalue.nCurValue; //一帧数据大小

			unsigned char* pFrameBuf = NULL;
            pFrameBuf = (unsigned char*)malloc(nBufSize);

            MV_FRAME_OUT_INFO_EX stInfo;
            memset(&stInfo, 0, sizeof(MV_FRAME_OUT_INFO_EX));


            nRet = MV_CC_GetOneFrameTimeout(m_handle, pFrameBuf, nBufSize, &stInfo, 1000);
            if (MV_OK != nRet)
            {
                Sleep(10);
            }
            else
            {
                //图片数据输入输出参数            
                MV_SAVE_IMG_TO_FILE_PARAM stParam;

                stParam.enImageType = MV_Image_Png;       //需要保存的图像类型
                stParam.enPixelType = stInfo.enPixelType; //相机对应的像素格式
                stParam.nWidth = stInfo.nWidth;           //相机图像宽
                stParam.nHeight = stInfo.nHeight;         //相机图像高
                stParam.nDataLen = stInfo.nFrameLen;      //原始图像数据长度
                stParam.pData = pFrameBuf;                //原始图像数据
                stParam.nQuality = 1;			          //jpg图像质量范围为(50-99], png图像质量范围为[0-9] 
                stParam.iMethodValue = 0;


                // 将数据格式化输出到字符串
                char chImageName[256] = { 0 };
				unsigned int nFrameNum = stInfo.nFrameNum;
                //sprintf_s(chImageName, 256, "Image%d_w%d_h%d_fn%03d.png", nDeviceIndex, stParam.nWidth, stParam.nHeight, nFrameNum);
				if (nDeviceIndex == 0) 
					sprintf_s(chImageName, 256, "image%02d_left.png", nTestFrameSize);
				else
					sprintf_s(chImageName, 256, "image%02d_right.png", nTestFrameSize);

				
                //void *memcpy(void *str1, const void *str2, size_t n) 
                //从存储区 str2 复制 n 个字符到存储区 str1。
                memcpy(stParam.pImagePath, chImageName, 256);
                cout << stParam.pImagePath << "\n";

                //保存图像到文件,该接口支持BMP/JPEG/PNG/TIFF。
                int nRet = MV_CC_SaveImageToFile(m_handle, &stParam);
                if (MV_OK != nRet)
                {
                    printf("Save photos failed! nRet [%x]\n", nRet);
                }
            }

            nTestFrameSize++;
			free(pFrameBuf);

			//停止采集图像 
			nRet = MV_CC_StopGrabbing(m_handle);
			if (MV_OK != nRet)
			{
				printf("error: StopGrabbing fail [%x]\n", nRet);
				return;
			}

			//关闭设备,释放资源
			nRet = MV_CC_CloseDevice(m_handle);
			if (MV_OK != nRet)
			{
				printf("error: CloseDevice fail [%x]\n", nRet);
				return;
			}

			//销毁句柄,释放资源
			nRet = MV_CC_DestroyHandle(m_handle);
			if (MV_OK != nRet)
			{
				printf("error: DestroyHandle fail [%x]\n", nRet);
				return;
			}
			//...其他处理

        }

    }

}


  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值