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

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

  • C接口定义
    • 图像处理
      • MV_CC_SaveImageEx2
/* 2020/2/14 Vivi
*/


//#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()
{
    int nRet = -1;
    void* m_handle = NULL;

    //枚举子网内指定的传输协议对应的所有设备
    unsigned int nTLayerType = MV_GIGE_DEVICE | MV_USB_DEVICE;
    MV_CC_DEVICE_INFO_LIST m_stDevList = { 0 };
    nRet = MV_CC_EnumDevices(nTLayerType, &m_stDevList);
    if (MV_OK != nRet)
    {
        printf("error: EnumDevices fail [%x]\n", nRet);
        return;
    }

    int i = 0;
    if (m_stDevList.nDeviceNum == 0)
    {
        printf("no camera found!\n");
        return;
    }

    //选择查找到的第一台在线设备,创建设备句柄
    int nDeviceIndex = 0;

    MV_CC_DEVICE_INFO m_stDevInfo = { 0 };
    memcpy(&m_stDevInfo, m_stDevList.pDeviceInfo[nDeviceIndex], sizeof(MV_CC_DEVICE_INFO));

    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, nAccessMode, nSwitchoverKey);
    /*   
    nAccessMode = MV_ACCESS_Exclusive,设备访问模式,默认独占模式 MV_ACCESS_Exclusive:独占权限,其他APP只允许读CCP寄存器。
    nSwitchoverKey = 0 切换权限时的密钥,默认为无,访问模式支持权限切换(2/4/6模式)时有效。 
    */
    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);
    cout<<"Trigger mode off\n";
    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);
    cout << "Exposure auto\n";
    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);
    cout << "Gain auto\n";
    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);
    cout << "Balance white auto\n";
    if (MV_OK != nRet)
    {
        printf("error: Balance white auto fail [%x]\n", nRet);
        return;
    }    

    //开始采集图像
    nRet = MV_CC_StartGrabbing(m_handle);
    cout << "Start grabbing...\n";
    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("Get PayloadSize failed! nRet [%x]\n", nRet);
        return;
    }
    int nBufSize = stIntvalue.nCurValue; //一帧数据大小

    unsigned int    nTestFrameSize = 0;
    unsigned char* pFrameBuf = NULL;
    pFrameBuf = (unsigned char*)malloc(nBufSize);

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

    //上层应用程序需要根据帧率,控制好调用该接口的频率
     //此次代码仅供参考,实际应用建议另建线程进行图像帧采集和处理
    while (1)
    {
        if (nTestFrameSize > 99)
        {
            break;
        }
        nRet = MV_CC_GetOneFrameTimeout(m_handle, pFrameBuf, nBufSize, &stInfo, 1000);
        if (MV_OK != nRet)
        {
            Sleep(10);
        }
        else
        {
            //图片数据输入输出参数            
            MV_SAVE_IMAGE_PARAM_EX stParam;

            //源数据                 
            stParam.pData = pFrameBuf;                //原始图像数据
            stParam.nDataLen = stInfo.nFrameLen;      //原始图像数据长度
            stParam.enPixelType = stInfo.enPixelType; //原始图像数据的像素格式
            stParam.nWidth = stInfo.nWidth;           //图像宽
            stParam.nHeight = stInfo.nHeight;         //图像高 
            stParam.nJpgQuality = 90;			      //JPEG图片编码质量  

            // ch:jpg图像质量范围为(50-99], png图像质量范围为[0-9]

            //目标数据
            stParam.enImageType = MV_Image_Jpeg;            //需要保存的图像类型,转换成JPEG格式
            //stParam.enImageType = MV_Image_Png;            //需要保存的图像类型,转换成PNG格式
            stParam.nBufferSize = nBufSize;                 //存储节点的大小
            unsigned char* pImage = (unsigned char*)malloc(nBufSize);
            stParam.pImageBuffer = pImage;                   //输出数据缓冲区,存放转换之后的图片数据         

            nRet = MV_CC_SaveImageEx2(m_handle, &stParam);
            if (MV_OK != nRet)
            {
                break;
            }

          
            //将转换之后图片数据保存成文件
            FILE* fp = fopen("test3.png", "wb");  // "wb" 只写打开或新建一个二进制文件;只允许写数据。
            fwrite(pImage, 1, stParam.nImageLen, fp);
            fclose(fp);
            free(pImage);

            //...其他图像数据处理
            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;
    }
    //system("pause");
}


  • 0
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值