Windows下Python调用海康SDK实时显示网络摄像头

news2024/11/26 6:22:51

参考资源:
1.《Windows下Python调用海康SDK实时显示网络摄像头》
2.《HikVision SDK: C++ 至 Python》
3.《linux下Python调用海康SDK实时显示网络摄像头》
4.《python调用海康sdk操作热成像设备获取对应点温度》
5.《Windows下Python调用海康SDK实时视频流获取》
6.《LINUX下PYTHON调用海康SDK实时视频流获取》

一、所需文件下载安装及环境变量配置

  • 1.1 安装OpenCV – 4.5.4
    • 1.1.1 使用Visual Studio
      • 1.1.1.1 [OpenCV下载地址](https://opencv.org/releases/)
      • 1.1.1.2 解压缩OpenCV
      • 1.1.1.3 安装VS2022
      • 1.1.1.4 VS2022配置
        • 1.1.1.4.1 官方C++测试代码 01
        • 1.1.1.4.2 官方C++测试代码 02
    • 1.1.2 使用Pycharm
      • 1.1.2.1 下载安装pip
        • 1.1.2.1.1 [pip官网下载地址](https://pypi.org/project/pip/#files)
        • 1.1.2.1.2 win10安装pip
        • 1.1.2.1.3 永久更换pip镜像源
        • 1.1.2.1.3.1 %APPDATA%
        • 1.1.2.1.3.2 新建pip文件夹、pip.ini文件
        • 1.1.2.1.3.3 编辑pip.ini文件
      • 1.1.2.2 安装opencv-python
        • 1.1.2.2.1 安装numpy
        • 1.1.2.2.2 安装opencv-python
  • 1.2 下载海康SDK包
  • 1.3 下载安装 Swig
  • 1.4 下载 OpenCV-swig 接口文件
  • 1.5 下载boost库
  • 1.6 环境变量配置
  • 2.1 将Opencv-swig文件夹的文件与HK源文件合并
    • 2.1.1 HKIPcamera.cpp
    • 2.1.2 HKIPcamera.h
    • 2.1.3 HKIPcamera.i
  • 2.2 输入命令行生成HKIPcamera_wrap.cxx、HKIPcamera.py文件
  • 3.1 先试验Opencv是否正常运行
  • 3.2 修改plaympeg4.h文件
  • 3.3 创建一个动态链接库工程
  • 3.4 添加编译的文件
  • 3.5 配置所需要的头文件、库文件、依赖项
  • 3.6 调用

1.1 安装OpenCV – 4.5.4

1.1.1 使用Visual Studio

OpenCV 之 编译配置 4.5.4

1.1.1.1 OpenCV下载地址

【从零学习OpenCV 4】Windows系统中安装OpenCV 4
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

1.1.1.2 解压缩OpenCV

在这里插入图片描述
解压缩之后的source目录
在这里插入图片描述
解压缩后的OpenCv文件夹

1.1.1.3 安装VS2022

安装教程可自行搜索

1.1.1.4 VS2022配置

《OpenCV编译VS2022配置》
《Windows中vs2019安装opencv4.5.4》
配置错误
配置ok

1.1.1.4.1 官方C++测试代码 01

// Test application for the Visual Studio Image Watch Debugger extension
#include <iostream>                        // std::cout
#include <opencv2/core/core.hpp>           // cv::Mat
#include <opencv2/imgcodecs/imgcodecs.hpp>     // cv::imread()
#include <opencv2/imgproc/imgproc.hpp>     // cv::Canny()
using namespace std;
using namespace cv;
void help()
{
    cout
        << "----------------------------------------------------" << endl
        << "This is a test program for the Image Watch Debugger " << endl
        << "plug-in for Visual Studio. The program loads an     " << endl
        << "image from a file and runs the Canny edge detector. " << endl
        << "No output is displayed or written to disk."
        << endl
        << "Usage:" << endl
        << "image-watch-demo inputimage" << endl
        << "----------------------------------------------------" << endl
        << endl;
}
int main(int argc, char* argv[])
{
    help();
    if (argc != 2)
    {
        cout << "Wrong number of parameters" << endl;
        return -1;
    }
    cout << "Loading input image: " << argv[1] << endl;
    Mat input;
    input = imread(argv[1], IMREAD_COLOR);
    cout << "Detecting edges in input image" << endl;
    Mat edges;
    Canny(input, edges, 10, 100);
    return 0;
}

1.1.1.4.2 官方C++测试代码 02

// Test application for the Visual Studio Image Watch Debugger extension
#include <iostream>                        // std::cout
#include <opencv2/core/core.hpp>           // cv::Mat
#include <opencv2/imgcodecs/imgcodecs.hpp>     // cv::imread()
#include <opencv2/imgproc/imgproc.hpp>     // cv::Canny()
using namespace std;
using namespace cv;
void help()
{
    cout
        << "----------------------------------------------------" << endl
        << "This is a test program for the Image Watch Debugger " << endl
        << "plug-in for Visual Studio. The program loads an     " << endl
        << "image from a file and runs the Canny edge detector. " << endl
        << "No output is displayed or written to disk."
        << endl
        << "Usage:" << endl
        << "image-watch-demo inputimage" << endl
        << "----------------------------------------------------" << endl
        << endl;
}
int main(int argc, char* argv[])
{
    help();
    if (argc != 2)
    {
        cout << "Wrong number of parameters" << endl;
        return -1;
    }
    cout << "Loading input image: " << argv[1] << endl;
    Mat input;
    input = imread(argv[1], IMREAD_COLOR);
    cout << "Detecting edges in input image" << endl;
    Mat edges;
    Canny(input, edges, 10, 100);
    return 0;
}

在这里插入图片描述

1.1.2 使用Pycharm

1.1.2.1 下载安装pip

《windows 安装pip 及更换pip国内源》

1.1.2.1.1 pip官网下载地址

在这里插入图片描述
在这里插入图片描述

1.1.2.1.2 win10安装pip

解压缩后的pip文件夹
输入**python setup.py install** 安装pip在这里插入图片描述
pip安装失败

pip安装失败,尝试更新升级pip

检查Scripts目录,发现pip.exe已经存在于目录,说明pip调用失败由于未环境变量引起
将pip目录添加至环境变量
当前目录shift+鼠标右键,打开Powershell
pip安装成功

1.1.2.1.3 永久更换pip镜像源

1.1.2.1.3.1 %APPDATA%

在windows文件管理器中,输入 %APPDATA%

1.1.2.1.3.2 新建pip文件夹、pip.ini文件

自动新定位到一个新的目录下,在该目录下新建pip文件夹,然后到pip文件夹里面去新建个pip.ini文件
在这里插入图片描述

1.1.2.1.3.3 编辑pip.ini文件

[global]
timeout =6000
index-url = https://pypi.douban.com/simple
trusted-host = pypi.douban.com

#[global]
#timeout =6000
#index-url = https://pypi.tuna.tsinghua.edu.cn/simple/
#trusted-host = pypi.tuna.tsinghua.edu.cn

#[global]
#timeout =6000
#index-url = https://mirrors.aliyun.com/pypi/simple/
#trusted-host = mirrors.aliyun.com

1.1.2.2 安装opencv-python

在Windows下安装配置OpenCV-Python-PyCharm开发环境

1.1.2.2.1 安装numpy

numpy

#安装方式:pip install numpy==版本号
pip install numpy==1.22.3

在这里插入图片描述

1.1.2.2.2 安装opencv-python

安装失败
安装失败
opencv-python 和opencv的区别何在?

pip install pip install opencv-python==4.5.5.64

在这里插入图片描述

1.2 下载海康SDK包

海康官网

1.3 下载安装 Swig

官网
在这里插入图片描述
在这里插入图片描述

1.4 下载 OpenCV-swig 接口文件

Github下载地址
在这里插入图片描述

1.5 下载boost库

下载地址
在这里插入图片描述

1.6 环境变量配置

二、使用swig生成接口文件

  • 1.1 安装OpenCV – 4.5.4
    • 1.1.1 使用Visual Studio
      • 1.1.1.1 [OpenCV下载地址](https://opencv.org/releases/)
      • 1.1.1.2 解压缩OpenCV
      • 1.1.1.3 安装VS2022
      • 1.1.1.4 VS2022配置
        • 1.1.1.4.1 官方C++测试代码 01
        • 1.1.1.4.2 官方C++测试代码 02
    • 1.1.2 使用Pycharm
      • 1.1.2.1 下载安装pip
        • 1.1.2.1.1 [pip官网下载地址](https://pypi.org/project/pip/#files)
        • 1.1.2.1.2 win10安装pip
        • 1.1.2.1.3 永久更换pip镜像源
        • 1.1.2.1.3.1 %APPDATA%
        • 1.1.2.1.3.2 新建pip文件夹、pip.ini文件
        • 1.1.2.1.3.3 编辑pip.ini文件
      • 1.1.2.2 安装opencv-python
        • 1.1.2.2.1 安装numpy
        • 1.1.2.2.2 安装opencv-python
  • 1.2 下载海康SDK包
  • 1.3 下载安装 Swig
  • 1.4 下载 OpenCV-swig 接口文件
  • 1.5 下载boost库
  • 1.6 环境变量配置
  • 2.1 将Opencv-swig文件夹的文件与HK源文件合并
    • 2.1.1 HKIPcamera.cpp
    • 2.1.2 HKIPcamera.h
    • 2.1.3 HKIPcamera.i
  • 2.2 输入命令行生成HKIPcamera_wrap.cxx、HKIPcamera.py文件
  • 3.1 先试验Opencv是否正常运行
  • 3.2 修改plaympeg4.h文件
  • 3.3 创建一个动态链接库工程
  • 3.4 添加编译的文件
  • 3.5 配置所需要的头文件、库文件、依赖项
  • 3.6 调用

2.1 将Opencv-swig文件夹的文件与HK源文件合并

HK源文件如下:

2.1.1 HKIPcamera.cpp

//HKIPcamera.cpp
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv2\opencv.hpp>
#include <iostream>
#include <time.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <windows.h>
#include "HCNetSDK.h"
//#include "PlayM4.h"
#include "plaympeg4.h"
 
 
 
//#include "global.h"
//#include "readCamera.h"
 
#define USECOLOR 1
 
using namespace cv;
using namespace std;
 
//--------------------------------------------
int iPicNum = 0;//Set channel NO.
LONG nPort = -1;
HWND hWnd = NULL;
CRITICAL_SECTION g_cs_frameList;
list<Mat> g_frameList;
LONG lUserID;
NET_DVR_DEVICEINFO_V30 struDeviceInfo;
HANDLE hThread;
LONG lRealPlayHandle = -1;
 
void yv12toYUV(char *outYuv, char *inYv12, int width, int height, int widthStep)
{
    int col, row;
    unsigned int Y, U, V;
    int tmp;
    int idx;
 
    //printf("widthStep=%d.\n",widthStep);
 
    for (row = 0; row<height; row++)
    {
        idx = row * widthStep;
        int rowptr = row*width;
 
        for (col = 0; col<width; col++)
        {
            //int colhalf=col>>1;
            tmp = (row / 2)*(width / 2) + (col / 2);
            //         if((row==1)&&( col>=1400 &&col<=1600))
            //         { 
            //          printf("col=%d,row=%d,width=%d,tmp=%d.\n",col,row,width,tmp);
            //          printf("row*width+col=%d,width*height+width*height/4+tmp=%d,width*height+tmp=%d.\n",row*width+col,width*height+width*height/4+tmp,width*height+tmp);
            //         } 
            Y = (unsigned int)inYv12[row*width + col];
            U = (unsigned int)inYv12[width*height + width*height / 4 + tmp];
            V = (unsigned int)inYv12[width*height + tmp];
            //         if ((col==200))
            //         { 
            //         printf("col=%d,row=%d,width=%d,tmp=%d.\n",col,row,width,tmp);
            //         printf("width*height+width*height/4+tmp=%d.\n",width*height+width*height/4+tmp);
            //         return ;
            //         }
            if ((idx + col * 3 + 2)> (1200 * widthStep))
            {
                //printf("row * widthStep=%d,idx+col*3+2=%d.\n",1200 * widthStep,idx+col*3+2);
            }
            outYuv[idx + col * 3] = Y;
            outYuv[idx + col * 3 + 1] = U;
            outYuv[idx + col * 3 + 2] = V;
        }
    }
    //printf("col=%d,row=%d.\n",col,row);
}
 
 
 
//解码回调 视频为YUV数据(YV12),音频为PCM数据
void CALLBACK DecCBFun(long nPort, char * pBuf, long nSize, FRAME_INFO * pFrameInfo, long nReserved1, long nReserved2)
{
    long lFrameType = pFrameInfo->nType;
 
    if (lFrameType == T_YV12)
    {
#if USECOLOR
        //int start = clock();
        static IplImage* pImgYCrCb = cvCreateImage(cvSize(pFrameInfo->nWidth, pFrameInfo->nHeight), 8, 3);//得到图像的Y分量  
        yv12toYUV(pImgYCrCb->imageData, pBuf, pFrameInfo->nWidth, pFrameInfo->nHeight, pImgYCrCb->widthStep);//得到全部RGB图像
        static IplImage* pImg = cvCreateImage(cvSize(pFrameInfo->nWidth, pFrameInfo->nHeight), 8, 3);
        cvCvtColor(pImgYCrCb, pImg, CV_YCrCb2RGB);
        //int end = clock();
#else
        static IplImage* pImg = cvCreateImage(cvSize(pFrameInfo->nWidth, pFrameInfo->nHeight), 8, 1);
        memcpy(pImg->imageData, pBuf, pFrameInfo->nWidth*pFrameInfo->nHeight);
#endif
        //printf("%d\n",end-start);
 
        //Mat frametemp(pImg), frame;
 
        //frametemp.copyTo(frame);
        //      cvShowImage("IPCamera",pImg);
        //      cvWaitKey(1);
        EnterCriticalSection(&g_cs_frameList);
        g_frameList.push_back(pImg);
        LeaveCriticalSection(&g_cs_frameList);
 
#if USECOLOR
        //      cvReleaseImage(&pImgYCrCb);
        //      cvReleaseImage(&pImg);
#else
        /*cvReleaseImage(&pImg);*/
#endif
        //此时是YV12格式的视频数据,保存在pBuf中,可以fwrite(pBuf,nSize,1,Videofile);
        //fwrite(pBuf,nSize,1,fp);
    }
    /***************
    else if (lFrameType ==T_AUDIO16)
    {
    //此时是音频数据,数据保存在pBuf中,可以fwrite(pBuf,nSize,1,Audiofile);
    }
    else
    {
    }
    *******************/
 
}
 
 
///实时流回调
void CALLBACK fRealDataCallBack(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer, DWORD dwBufSize, void *pUser)
{
    DWORD dRet;
    switch (dwDataType)
    {
    case NET_DVR_SYSHEAD:    //系统头
        if (!PlayM4_GetPort(&nPort)) //获取播放库未使用的通道号
        {
            break;
        }
        if (dwBufSize > 0)
        {
            if (!PlayM4_OpenStream(nPort, pBuffer, dwBufSize, 1024 * 1024))
            {
                dRet = PlayM4_GetLastError(nPort);
                break;
            }
            //设置解码回调函数 只解码不显示
            if (!PlayM4_SetDecCallBack(nPort, DecCBFun))
            {
                dRet = PlayM4_GetLastError(nPort);
                break;
            }
 
            //设置解码回调函数 解码且显示
            //if (!PlayM4_SetDecCallBackEx(nPort,DecCBFun,NULL,NULL))
            //{
            //  dRet=PlayM4_GetLastError(nPort);
            //  break;
            //}
 
            //打开视频解码
            if (!PlayM4_Play(nPort, hWnd))
            {
                dRet = PlayM4_GetLastError(nPort);
                break;
            }
 
            //打开音频解码, 需要码流是复合流
            //          if (!PlayM4_PlaySound(nPort))
            //          {
            //              dRet=PlayM4_GetLastError(nPort);
            //              break;
            //          }       
        }
        break;
 
    case NET_DVR_STREAMDATA:   //码流数据
        if (dwBufSize > 0 && nPort != -1)
        {
            BOOL inData = PlayM4_InputData(nPort, pBuffer, dwBufSize);
            while (!inData)
            {
                Sleep(10);
                inData = PlayM4_InputData(nPort, pBuffer, dwBufSize);
                OutputDebugString(L"PlayM4_InputData failed \n");
            }
        }
        break;
    }
}
 
void CALLBACK g_ExceptionCallBack(DWORD dwType, LONG lUserID, LONG lHandle, void *pUser)
{
    char tempbuf[256] = { 0 };
    switch (dwType)
    {
    case EXCEPTION_RECONNECT:    //预览时重连
        printf("----------reconnect--------%d\n", time(NULL));
        break;
    default:
        break;
    }
}
 
bool OpenCamera(char* ip, char* usr, char* password)
{
    lUserID = NET_DVR_Login_V30(ip, 8000, usr, password, &struDeviceInfo);
    if (lUserID == 0)
    {
        cout << "Log in success!" << endl;
        return TRUE;
    }
    else
    {
        printf("Login error, %d\n", NET_DVR_GetLastError());
        NET_DVR_Cleanup();
        return FALSE;
    }
}
DWORD WINAPI ReadCamera(LPVOID IpParameter)
{
    //---------------------------------------
    //设置异常消息回调函数
    NET_DVR_SetExceptionCallBack_V30(0, NULL, g_ExceptionCallBack, NULL);
 
    //cvNamedWindow("Mywindow", 0);
    //cvNamedWindow("IPCamera", 0);
 
    //HWND  h = (HWND)cvGetWindowHandle("Mywindow");
    //h = cvNamedWindow("IPCamera");
    //---------------------------------------
    //启动预览并设置回调数据流 
    NET_DVR_CLIENTINFO ClientInfo;
    ClientInfo.lChannel = 1;        //Channel number 设备通道号
    ClientInfo.hPlayWnd = NULL;     //窗口为空,设备SDK不解码只取流
    ClientInfo.lLinkMode = 1;       //Main Stream
    ClientInfo.sMultiCastIP = NULL;
 
    LONG lRealPlayHandle;
    lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, fRealDataCallBack, NULL, TRUE);
    if (lRealPlayHandle<0)
    {
        printf("NET_DVR_RealPlay_V30 failed! Error number: %d\n", NET_DVR_GetLastError());
        return -1;
    }
    else
        cout << "码流回调成功!" << endl;
    Sleep(-1);
    if (!NET_DVR_StopRealPlay(lRealPlayHandle))
    {
        printf("NET_DVR_StopRealPlay error! Error number: %d\n", NET_DVR_GetLastError());
        return 0;
    }
    NET_DVR_Logout(lUserID);
    NET_DVR_Cleanup();
    return 0;
}
 
 
void init(char* ip, char* usr, char* password){
    //HANDLE hThread;
    //LPDWORD threadID;
    //---------------------------------------
    // 初始化
    NET_DVR_Init();
    //设置连接时间与重连时间
    NET_DVR_SetConnectTime(2000, 1);
    NET_DVR_SetReconnect(10000, true);
    OpenCamera(ip, usr, password);
    InitializeCriticalSection(&g_cs_frameList);
    hThread = ::CreateThread(NULL, 0, ReadCamera, NULL, 0, 0);
}
 
Mat getframe(){
    Mat frame1;
    EnterCriticalSection(&g_cs_frameList);
    while (!g_frameList.size()){
        LeaveCriticalSection(&g_cs_frameList);
        EnterCriticalSection(&g_cs_frameList);
    }
    list<Mat>::iterator it;
    it = g_frameList.end();
    it--;
    Mat dbgframe = (*(it));
    (*g_frameList.begin()).copyTo(frame1);
    frame1 = dbgframe;
    g_frameList.pop_front();
    //imshow("camera", frame1);
    //waitKey(1);
 
    g_frameList.clear();   // 丢掉旧的帧
    LeaveCriticalSection(&g_cs_frameList);
    return(frame1);
}
 
void release(){
    ::CloseHandle(hThread);
    NET_DVR_StopRealPlay(lRealPlayHandle);
    //关闭预览
    NET_DVR_Logout(lUserID);
    //注销用户
    NET_DVR_Cleanup();
}

2.1.2 HKIPcamera.h

//HKIPcamera.h
#include <opencv2/opencv.hpp>
using namespace cv;
 
void init(char* ip, char* usr, char* password);
Mat getframe();
void release();

2.1.3 HKIPcamera.i

// HKIPcamera.i
/*  Example of wrapping a C function that takes a C double array as input using
 *  numpy typemaps for SWIG. */
%module HKIPcamera
%include <opencv/mat.i>
%cv_mat__instantiate_defaults
%header %{
    /*  Includes the header in the wrapper code */
    #include "HKIPcamera.h"
%}
 
%include "HKIPcamera.h"

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
合并后的文件夹

2.2 输入命令行生成HKIPcamera_wrap.cxx、HKIPcamera.py文件

《windows下使用swig》
《Windows平台下Python使用swig调用C++》
命令行:

swig -I"D:\Program Files\PyCharm 2021.3.3\pip\opencv-4.5.4\opencv\build\include" -python -c++ HKIPcamera.i

注意opencv安装的头文件路径

三、编译动态链接库

  • 1.1 安装OpenCV – 4.5.4
    • 1.1.1 使用Visual Studio
      • 1.1.1.1 [OpenCV下载地址](https://opencv.org/releases/)
      • 1.1.1.2 解压缩OpenCV
      • 1.1.1.3 安装VS2022
      • 1.1.1.4 VS2022配置
        • 1.1.1.4.1 官方C++测试代码 01
        • 1.1.1.4.2 官方C++测试代码 02
    • 1.1.2 使用Pycharm
      • 1.1.2.1 下载安装pip
        • 1.1.2.1.1 [pip官网下载地址](https://pypi.org/project/pip/#files)
        • 1.1.2.1.2 win10安装pip
        • 1.1.2.1.3 永久更换pip镜像源
        • 1.1.2.1.3.1 %APPDATA%
        • 1.1.2.1.3.2 新建pip文件夹、pip.ini文件
        • 1.1.2.1.3.3 编辑pip.ini文件
      • 1.1.2.2 安装opencv-python
        • 1.1.2.2.1 安装numpy
        • 1.1.2.2.2 安装opencv-python
  • 1.2 下载海康SDK包
  • 1.3 下载安装 Swig
  • 1.4 下载 OpenCV-swig 接口文件
  • 1.5 下载boost库
  • 1.6 环境变量配置
  • 2.1 将Opencv-swig文件夹的文件与HK源文件合并
    • 2.1.1 HKIPcamera.cpp
    • 2.1.2 HKIPcamera.h
    • 2.1.3 HKIPcamera.i
  • 2.2 输入命令行生成HKIPcamera_wrap.cxx、HKIPcamera.py文件
  • 3.1 先试验Opencv是否正常运行
  • 3.2 修改plaympeg4.h文件
  • 3.3 创建一个动态链接库工程
  • 3.4 添加编译的文件
  • 3.5 配置所需要的头文件、库文件、依赖项
  • 3.6 调用

3.1 先试验Opencv是否正常运行

3.2 修改plaympeg4.h文件

3.3 创建一个动态链接库工程

3.4 添加编译的文件

3.5 配置所需要的头文件、库文件、依赖项

3.6 调用

这里写目录标题

  • 1.1 安装OpenCV – 4.5.4
    • 1.1.1 使用Visual Studio
      • 1.1.1.1 [OpenCV下载地址](https://opencv.org/releases/)
      • 1.1.1.2 解压缩OpenCV
      • 1.1.1.3 安装VS2022
      • 1.1.1.4 VS2022配置
        • 1.1.1.4.1 官方C++测试代码 01
        • 1.1.1.4.2 官方C++测试代码 02
    • 1.1.2 使用Pycharm
      • 1.1.2.1 下载安装pip
        • 1.1.2.1.1 [pip官网下载地址](https://pypi.org/project/pip/#files)
        • 1.1.2.1.2 win10安装pip
        • 1.1.2.1.3 永久更换pip镜像源
        • 1.1.2.1.3.1 %APPDATA%
        • 1.1.2.1.3.2 新建pip文件夹、pip.ini文件
        • 1.1.2.1.3.3 编辑pip.ini文件
      • 1.1.2.2 安装opencv-python
        • 1.1.2.2.1 安装numpy
        • 1.1.2.2.2 安装opencv-python
  • 1.2 下载海康SDK包
  • 1.3 下载安装 Swig
  • 1.4 下载 OpenCV-swig 接口文件
  • 1.5 下载boost库
  • 1.6 环境变量配置
  • 2.1 将Opencv-swig文件夹的文件与HK源文件合并
    • 2.1.1 HKIPcamera.cpp
    • 2.1.2 HKIPcamera.h
    • 2.1.3 HKIPcamera.i
  • 2.2 输入命令行生成HKIPcamera_wrap.cxx、HKIPcamera.py文件
  • 3.1 先试验Opencv是否正常运行
  • 3.2 修改plaympeg4.h文件
  • 3.3 创建一个动态链接库工程
  • 3.4 添加编译的文件
  • 3.5 配置所需要的头文件、库文件、依赖项
  • 3.6 调用

这里写目录标题

  • 1.1 安装OpenCV – 4.5.4
    • 1.1.1 使用Visual Studio
      • 1.1.1.1 [OpenCV下载地址](https://opencv.org/releases/)
      • 1.1.1.2 解压缩OpenCV
      • 1.1.1.3 安装VS2022
      • 1.1.1.4 VS2022配置
        • 1.1.1.4.1 官方C++测试代码 01
        • 1.1.1.4.2 官方C++测试代码 02
    • 1.1.2 使用Pycharm
      • 1.1.2.1 下载安装pip
        • 1.1.2.1.1 [pip官网下载地址](https://pypi.org/project/pip/#files)
        • 1.1.2.1.2 win10安装pip
        • 1.1.2.1.3 永久更换pip镜像源
        • 1.1.2.1.3.1 %APPDATA%
        • 1.1.2.1.3.2 新建pip文件夹、pip.ini文件
        • 1.1.2.1.3.3 编辑pip.ini文件
      • 1.1.2.2 安装opencv-python
        • 1.1.2.2.1 安装numpy
        • 1.1.2.2.2 安装opencv-python
  • 1.2 下载海康SDK包
  • 1.3 下载安装 Swig
  • 1.4 下载 OpenCV-swig 接口文件
  • 1.5 下载boost库
  • 1.6 环境变量配置
  • 2.1 将Opencv-swig文件夹的文件与HK源文件合并
    • 2.1.1 HKIPcamera.cpp
    • 2.1.2 HKIPcamera.h
    • 2.1.3 HKIPcamera.i
  • 2.2 输入命令行生成HKIPcamera_wrap.cxx、HKIPcamera.py文件
  • 3.1 先试验Opencv是否正常运行
  • 3.2 修改plaympeg4.h文件
  • 3.3 创建一个动态链接库工程
  • 3.4 添加编译的文件
  • 3.5 配置所需要的头文件、库文件、依赖项
  • 3.6 调用

这里写目录标题

  • 1.1 安装OpenCV – 4.5.4
    • 1.1.1 使用Visual Studio
      • 1.1.1.1 [OpenCV下载地址](https://opencv.org/releases/)
      • 1.1.1.2 解压缩OpenCV
      • 1.1.1.3 安装VS2022
      • 1.1.1.4 VS2022配置
        • 1.1.1.4.1 官方C++测试代码 01
        • 1.1.1.4.2 官方C++测试代码 02
    • 1.1.2 使用Pycharm
      • 1.1.2.1 下载安装pip
        • 1.1.2.1.1 [pip官网下载地址](https://pypi.org/project/pip/#files)
        • 1.1.2.1.2 win10安装pip
        • 1.1.2.1.3 永久更换pip镜像源
        • 1.1.2.1.3.1 %APPDATA%
        • 1.1.2.1.3.2 新建pip文件夹、pip.ini文件
        • 1.1.2.1.3.3 编辑pip.ini文件
      • 1.1.2.2 安装opencv-python
        • 1.1.2.2.1 安装numpy
        • 1.1.2.2.2 安装opencv-python
  • 1.2 下载海康SDK包
  • 1.3 下载安装 Swig
  • 1.4 下载 OpenCV-swig 接口文件
  • 1.5 下载boost库
  • 1.6 环境变量配置
  • 2.1 将Opencv-swig文件夹的文件与HK源文件合并
    • 2.1.1 HKIPcamera.cpp
    • 2.1.2 HKIPcamera.h
    • 2.1.3 HKIPcamera.i
  • 2.2 输入命令行生成HKIPcamera_wrap.cxx、HKIPcamera.py文件
  • 3.1 先试验Opencv是否正常运行
  • 3.2 修改plaympeg4.h文件
  • 3.3 创建一个动态链接库工程
  • 3.4 添加编译的文件
  • 3.5 配置所需要的头文件、库文件、依赖项
  • 3.6 调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784942.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)六:后台主页功能实现下

一、本章内容 接上一章,继续实现后端主页内容,主要实现工具栏对应相关内容的实现,包括系统消息、系统公告、全屏切换、语言切换、主题切换等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 基于VUE3+Layui从头搭建通用后台管理系统合集…

(五)RabbitMQ-进阶 死信队列、延迟队列、防丢失机制

Lison <dreamlison163.com>, v1.0.0, 2023.06.23 RabbitMQ-进阶 死信队列、延迟队列、防丢失机制 文章目录 RabbitMQ-进阶 死信队列、延迟队列、防丢失机制死信队列延迟队列延迟队列介绍**延迟队列_死信队列_的实现**延迟队列_插件实现下载插件RabbitMQ 配置类RabbitMQ …

知网的caj格式怎么转化成pdf格式?两个方法简单快捷!

在使用知网等学术资源时&#xff0c;我们常常会遇到CAJ格式的文件&#xff0c;然而CAJ格式并不是常见的文件格式&#xff0c;给我们的查阅和分享带来一些不便。为了更方便地处理这些文件&#xff0c;我们可以将其转换为常见的PDF格式。在本文中&#xff0c;我将为您介绍两种简单…

Docker——网络原理

Docker——网络 一、Docker 网络1&#xff0e;Docker 网络实现原理2&#xff0e;Docker 的网络模式 二、网络模式详解1&#xff0e;host模式2&#xff0e;container模式3&#xff0e;none模式4&#xff0e;bridge模式5&#xff0e;自定义网络 三、资源控制1&#xff0e;CPU 资源…

做测开的3年总结

大家好&#xff0c;我是洋子 进入测试行业刚满3年了&#xff0c;毕业北漂也满3年了&#xff0c;回顾一下这3年的工作和生活 下面文章我将会从QA这个岗位的角度复盘一下这3年来的所思所想&#xff0c;有刚入行的小伙伴可能不太清楚QA&#xff08;Quality Assurance&#xff09…

【RabbitMQ】之高可用集群搭建

目录 一、RabbitMQ 集群原理 1、默认集群原理2、镜像集群原理3、负载均衡方案 二、RabbitMQ 高可用集群搭建 1、RabbitMQ 集群搭建2、配置镜像队列3、HAProxy 环境搭建4、Keepalived 环境搭建 一、RabbitMQ 集群简介 1、默认集群原理 3-1、RabbitMQ 集群简介 单台 RabbitM…

第二招牌——创造企业结构性增长的有效战略工具

在现代商业环境中&#xff0c;企业面临着激烈的竞争和不断变化的市场条件。为了在这个竞争激烈的环境中生存和持续发展&#xff0c;企业必须不断寻求创新和增长的机会。这就需要企业创造结构性增长&#xff0c;不仅仅是依靠传统的业务模式和产品线&#xff0c;还要不断的拓展新…

elasticsearch报错问题

标题1.报错问题 标题2.新建一个配置类 package cn.itcast.hotel.config;import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.elasticsearch.client.RestClient; import org.elasticsearch.client.RestClientBuilder; import o…

SecureCRT如何将复制的内容粘贴到word中仍然保持原有字体颜色

SecureCRT如何将复制的内容粘贴到word中仍然保持原有字体颜色 QQ 109792317 说明&#xff1a;当SecureCRT加载了配色文件后&#xff0c;输出的关键字会被不同颜色高亮显示&#xff0c;但是如果复制粘贴到word中会发现成了纯文本&#xff0c;字体颜色消失了。 如何保留 &#x…

真空压力控制技术在三轴仪土壤制样、力学和渗透性能测试中的应用

摘要&#xff1a;在当前的各种三轴测试仪中&#xff0c;对月壤和月壤模拟物的样品制备和力学性能测试还无法实现样品的真空制备、测试过程中的可变围压控制和样品的超真空度准确控制。为此本文提出了实现这些功能的解决方案&#xff0c;解决方案采用不同气体流量控制技术以及特…

npm i babel-plugin-import -D之后报错

替换modules/.bin/XX文件 1.vue-cli-service #!/bin/sh basedir$(dirname "$(echo "$0" | sed -e s,\\,/,g)")case uname in*CYGWIN*) basedircygpath -w "$basedir";; esacif [ -x "$basedir/node" ]; then"$basedir/node"…

Cilium系列-4-Cilium本地路由

系列文章 Cilium 系列文章 前言 在前文中我们提到, cilium install 默认安装后, Cilium 功能启用和禁用情况如下: datapath mode: tunnel: 因为兼容性原因&#xff0c;Cilium 会默认启用 tunnel&#xff08;基于 vxlan) 的 datapatch 模式&#xff0c;也就是 overlay 网络结…

【主成分分析(PCA)】

主成分分析&#xff08;PCA&#xff09; 摘要 在现代数据科学中&#xff0c;维度灾难常常是数据处理与分析的一大难题。主成分分析&#xff08;PCA&#xff09;是一种广泛使用的数据降维技术&#xff0c;它通过将原始数据转换为新的低维空间&#xff0c;保留最重要的信息&…

【docker】docker部署tomcat

目录 1.1 搜索tomcat镜像1.2 拉取tomcat镜像1.3 创建容器&#xff0c;设置端口映射、目录映射1.4 测试 1.1 搜索tomcat镜像 docker search tomcat1.2 拉取tomcat镜像 docker pull tomcat1.3 创建容器&#xff0c;设置端口映射、目录映射 # 在/root目录下创建tomcat目录用于存…

网络:TCP/IP协议

1. OSI七层参考模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 2. TCP/IP模型 应用层 传输层 网络层 数据链路层 物理层 3. 各链路层对应的名称 应用层对应的是协议数据单元 传输层对应的是数据段 网络层对应的是数据包 链路层对应的是数据帧 物理层对应的是比特…

领域驱动设计(五) - 战术设计 - 【2/3】领域服务、事件、模块

一、领域服务 当操作不适合放在聚合和值对象上时&#xff0c;最好的方式就是使用领域服务。领域服务是一个无状态的操作&#xff0c;一个领域服务有可能操作多个领域对象&#xff0c;它用于实现特定于某个领域的任务。领域服务需要处理逻辑&#xff0c;不建议做为soap接口对外…

C++day7(异常处理机制、Lambda表达式、类型转换、STL标准库模板、迭代器、list)

#include <iostream>using namespace std; template <typename T> class vector { private:T* first;T* last;T* end; public:vector():first(new T),last(first),end(first){cout<<"无参构造"<<endl;}//无参构造vector(T* f):first(f),last…

如何写好代码

一、什么是好代码 抛开性能、并发、一致性等技术因素&#xff0c;好的业务代码&#xff0c;应当如一篇显浅易懂的业务叙实文章&#xff0c;满足以下几个基本条件&#xff1a; 词要达意&#xff1a;最基础的变量、函数、类的命名&#xff0c;是否名达其意。 结构清晰&#xff…

supersqli

这个题&#xff0c;其实之前做过&#xff0c;这里只是换了个名字而已 输入1&#xff0c;提交后可以明显发现url发生变化 &#xff0c;可以猜测SQL注入 源码提示sqlmap是没有灵魂的&#xff0c;说明确实是sql注入 万能密码可以可以到&#xff0c;所包含的表 利用order by查看&a…

安卓之事件分发机制

安卓之事件分发机制 简介 事件分发的”事件“是指什么&#xff1f; 答&#xff1a;点击事件&#xff08;Touch事件&#xff09;。当用户触摸屏幕&#xff08;VIew或ViewGroup&#xff09;时&#xff0c;将产生点击事件&#xff0c;即Touch事件。Touch事件的细节&#xff08;如…