2018-09-03:python 调用C++函数 && C++调取海康摄像头照片

C++调取海康摄像头:
首先下载 海康摄像头 linux 版本的SDK: CH_HCNetSDK_V5.3.5.2_build20171124_Linux64.zip
解压后进入consoleDemo目录,这里是官方提供的Demo代码,可以实现多个测试功能:

        printf("Input 1, Test GetStream\n");
        printf("      2, Test Configure params\n");
        printf("      3, Test Alarm\n");
        printf("      4, Test Capture Picture\n");
        printf("      5, Test play back\n");
        printf("      6, Test Voice\n");
        printf("      7, Test SDK ability\n");
        printf("      8, Test tool interface\n");

上面就是consoleMain.cpp主函数里统计的方法入口.
在用Makefile文件编译的时候,需要将CH_HCNetSDK_V5.3.5.2_build20171124_Linux64/lib中的所有的文件复制到CH_HCNetSDK_V5.3.5.2_build20171124_Linux64/consoleDemo/linux64/lib中


2018-09-03:python 调用C++函数 && C++调取海康摄像头照片_第1张图片
image.png

之后进入CH_HCNetSDK_V5.3.5.2_build20171124_Linux64/consoleDemo/linux64/proj目录:
cd CH_HCNetSDK_V5.3.5.2_build20171124_Linux64/consoleDemo/linux64/proj
目录中有一个Makefile文件,直接执行 make 命令就可以编译了.
编译成功后,进入目录: CH_HCNetSDK_V5.3.5.2_build20171124_Linux64/consoleDemo/linux64
会生成一个可执行文件:sdkTest
直接执行./sdkTest 就启动了
按照提示输入1-8即可体验上面列出的功能.
例如输入:4
就会抓取摄像头的照片,并保存为ssss.jpeg文件

通过改造,就可以将摄像头的照片一直保存到本地了,
顺便把consoleMain.cpp文件删掉,或把里面的main函数去掉,在CapPicture.cpp中添加main函数,这样直接编译后就进入CapPicture.cpp中的main函数了, 改造代码如下:

/*
* Copyright(C) 2010,Hikvision Digital Technology Co., Ltd 
* 
* File   name��CapPicture.cpp
* Discription��
* Version    ��1.0
* Author     ��panyd
* Create Date��2010_3_25
* Modification History��
*/

#include "public.h"
#include "CapPicture.h"
#include 
#include 

/*******************************************************************
      Function:   Demo_Capture
   Description:   Capture picture.
     Parameter:   (IN)   none 
        Return:   0--success��-1--fail.   
**********************************************************************/

using namespace std;

int Demo_Capture()
{
    NET_DVR_Init();
    long lUserID;
    //login
    NET_DVR_DEVICEINFO_V30 struDeviceInfo;
    lUserID = NET_DVR_Login_V30("10.200.16.30", 8000, "admin", "admin1234", &struDeviceInfo);
    if (lUserID < 0)
    {
        printf("pyd1---Login error, %d\n", NET_DVR_GetLastError());
        return HPR_ERROR;
    }

    //
    NET_DVR_JPEGPARA strPicPara = {0};
    strPicPara.wPicQuality = 2;
    strPicPara.wPicSize = 0;
    int iRet;
    iRet = NET_DVR_CaptureJPEGPicture(lUserID, struDeviceInfo.byStartChan, &strPicPara, "./ssss.jpeg");
    if (!iRet)
    {
        printf("pyd1---NET_DVR_CaptureJPEGPicture error, %d\n", NET_DVR_GetLastError());
        return HPR_ERROR;
    }


    LPNET_DVR_JPEGPARA JpegPara = new NET_DVR_JPEGPARA;  
    JpegPara->wPicQuality = 0;  
    JpegPara->wPicSize = 9;  
    char * Jpeg = new char[200*1024];  
    DWORD len = 200*1024;  
    LPDWORD Ret = 0;  
    
    if(!NET_DVR_SetCapturePictureMode(BMP_MODE))  
    {  
        printf("Set Capture Picture Mode error!");  
        printf("The error code is %d", NET_DVR_GetLastError());  
    }  

    printf("AAAAAAAAAA!"); 
    //bool capture = NET_DVR_CaptureJPEGPicture(lUserID,1,JpegPara,"1111");  

    int i = 0;
    time_t t_start, t_end; 
    while(1) 
    {
         t_start = time(NULL);
        // printf("begin[%d]:%ld",i,getCurrentTime()); 
        bool capture = NET_DVR_CaptureJPEGPicture_NEW(lUserID,struDeviceInfo.byStartChan,JpegPara,Jpeg,len,Ret);  
        if(!capture)  
        {  
            printf("Error: NET_DVR_CaptureJPEGPicture_NEW = %d", NET_DVR_GetLastError());  
            return -1;    
        }
        printf("BBBBBBBBBBBB!"); 
        // for(int i=0;i<200*1024;i++)  
        // {
        //     printf("%d:%c",i,Jpeg[i]); 
        // }   

        FILE* fp;
        char fname[50] = {};
        sprintf(fname, "%s%d%s", "qqqq_", i++, ".jpg");
        fp = fopen(fname,"wb+"); //wb+ 以读写方式打开或建立二进制文件
        if(fp == NULL)
        {
            return false;//建立失败
        }
        fwrite(Jpeg,sizeof(char),200*1024,fp);//按字写入buffer,共size字节
        fclose(fp); 
        t_end = time(NULL);
         printf("time[%d]: %.0f s\n",i,difftime(t_end,t_start));
    }

    // vector data(200*1024); 


    // while(1)  
    // {  
    //     bool capture = NET_DVR_CaptureJPEGPicture_NEW(lUserID,struDeviceInfo.byStartChan,JpegPara,Jpeg,len,Ret);  
    //     if(!capture)  
    //     {  
    //         printf("Error: NET_DVR_CaptureJPEGPicture_NEW = %d", NET_DVR_GetLastError());  
    //         return -1;    
    //     }     
  
    //     for(int i=0;i<200*1024;i++)  
    //         data[i] = Jpeg[i];  
  
    //     Mat img = imdecode(Mat(data),1);  
    //     imshow("camera",img);  
    //     waitKey(1);   
    // }  

    //logout
    NET_DVR_Logout_V30(lUserID);
    NET_DVR_Cleanup();

    return HPR_OK;

}

int main()
{
    Demo_Capture();
    printf("ddddddd, Test Capture Picture\n");
}

你可能感兴趣的:(2018-09-03:python 调用C++函数 && C++调取海康摄像头照片)