精华内容
下载资源
问答
  • 文章目录c++ 调用 Python安装Python写一个简单的python函数写c++ 程序第一步 添加python的声明 和设置Python的安装路径第二步:初始化python接口第三步:初始化python系统文件路径,保证可以访问到 .py文件第四步:...

    c++ 调用 Python


    参考文档

    安装Python

    首先安装Python,并记录头文件和库文件的位置。
    编译的时候用到;
    例:

    g++ -o sample  sample.cpp -I /usr/include/python3.6/ -L /usr/lib/python3.6/config-3.6m-x86_64-linux-gnu -lpython3.6
    

    写一个简单的python函数

    例:

    #coding = utf-8
    #!/usr/bin/python
    #Filename:TestModule.py
    def Hello(s):
        print ("Hello World")
        print(s)
    
    def Add(a, b):
        print('a=', a)
        print ('b=', b)
        return a + b
    
    def Add2(a,b,c):
        return a + b + c
    
    class Test:
        def __init__(self):
            print("Init")
        def SayHello(self, name):
            print ("Hello,", name)
            return name
    
    

    写c++ 程序

    第一步 添加python的声明 和设置Python的安装路径

    #include "Python.h"
    
    Py_SetPythonHome(L"/usr/local/Anaconda3/envs/pytorch_gpu"); //非必须
    

    第二步:初始化python接口

    	//初始化Python
        Py_Initialize();
    	if (!Py_IsInitialized())
    	{
    		return -1;
    	}
    
    

    第三步:初始化python系统文件路径,保证可以访问到 .py文件

    PyRun_SimpleString("import sys");  
    PyRun_SimpleString("sys.path.append('./')");  
    

    第四步:引用模板

    PyObject *pModule = PyImport_ImportModule("TestModule");
    

    第五步:调用函数

        //直接获取模板中的函数
        PyObject *pFunc = PyObject_GetAttrString(pModule, "Hello");
    
        //参数类型转换,传递一个字符串。将c/c++类型的字符串转换为python类型,元组中的python类型查看python文档
        PyObject *pArg = Py_BuildValue("(s)", "Hello World");
    
        //调用直接获得的函数,并传递参数
        PyEval_CallObject(pFunc, pArg);
    
    

    第六步:结束python接口初始化

    Py_Finalize();
    

    demo

    #include "Python.h"
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
    	//初始化Python
        Py_Initialize();
    	if (!Py_IsInitialized())
    	{
    		return -1;
    	}
    
        //直接运行Python代码
        PyRun_SimpleString("print('----------Python Start')");
    
        //引入Python文件的路径
        PyRun_SimpleString("import sys");  
        PyRun_SimpleString("sys.path.append('./python/')"); 
    
        //引入模板
        //printf("PyImport_ImportModule\n");
        PyObject *pModule = PyImport_ImportModule("TestModule");
    
        //获取模板字典属性
        PyObject *pDict = PyModule_GetDict(pModule);
    
        //直接获取模板中的函数
        PyObject *pFunc = PyObject_GetAttrString(pModule, "Hello");
    
        //参数类型转换,传递一个字符串。将c/c++类型的字符串转换为python类型,元组中的python类型查看python文档
        PyObject *pArg = Py_BuildValue("(s)", "Hello World");
    
        //调用直接获得的函数,并传递参数
        PyEval_CallObject(pFunc, pArg);
    
        printf("-----------------\n");
    
        //从字典属性中获取函数
        pFunc = PyDict_GetItemString(pDict, "Add");
        //参数类型转换,传递两个整型参数
        pArg = Py_BuildValue("(i, i)", 1, 2);
    
        //调用函数,并得到python类型的返回值
        PyObject *result = PyEval_CallObject(pFunc, pArg);
        //c用来保存c/c++类型的返回值
        int c;
        //将python类型的返回值转换为c/c++类型
        PyArg_Parse(result, "i", &c);
        //输出返回值
        printf("a+b=%d\n", c);
    
        printf("------------------\n");
        PyObject *pFunc2 = PyObject_GetAttrString(pModule, "Add2");
    
        //创建参数:
    	PyObject *pArgs = PyTuple_New(3);//函数调用的参数传递均是以元组的形式打包的,2表示参数个数
    	PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 6));//0--序号,i表示创建int型变量
    	PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 8));//1--序号
        PyTuple_SetItem(pArgs, 2, Py_BuildValue("i", 10));//2--序号
    	//返回值
    	PyObject* pReturn = NULL;
    	pReturn = PyEval_CallObject(pFunc2, pArgs);//调用函数
    	//将返回值转换为int类型
    	int tmpresult;
    	PyArg_Parse(pReturn, "i", &tmpresult);     //i表示转换成int型变量
    	printf("6+8+10 = %d\n",tmpresult);
    
        printf("------------------\n");
    
        //通过字典属性获取模块中的类
        PyObject *pClass = PyDict_GetItemString(pDict, "Test");
    
        //实例化获取的类
        PyObject *pInstance = PyInstanceMethod_New(pClass);
        //调用类的方法
        //result = PyObject_CallMethod(pInstance, "SayHello", "(Os)", pInstance, "Charity");
        result = PyObject_CallMethod(pClass, "SayHello", "(Os)", pInstance, "Charity");
        //输出返回值
        char* name=NULL;
        PyArg_Parse(result, "s", &name);
        printf("%s\n", name);
    
        //释放python
        Py_Finalize();
        getchar();
        return 0;
    
    }
    
    
    

    参数传递

    参数为空

    pFunc = PyObject_GetAttrString(pModule, "Hellotest");
    PyEval_CallObject(pFunc, NULL);
    

    参数不为空

    PyObject_CallMethod(pClass, “class_method”, “O”, pInstance)
    

    参数分别为 PyObject(类),string(类方法),string(O表示参数为PyObject) ,PyObject(类实例)

    PyObject_CallFunction(pFun, “O”, pyores)
    

    参数分别为 PyObject(函数),string(O表示参数为PyObject) ,PyObject(函数中使用的参数)

    多个参数:

    PyObject_CallFunction(pFun, “OO…O”, PyObject 1,PyObject 2…PyObject n)
    

    中间的O可替换成参数类型说明符中的任意一个,比如字符串s,int型变量i等等

    元组传参

    //创建一个元组
    PyObject *pArgs = PyTuple_New(3);
    PyTuple_SetItem(pArgs, 0, Py_BuildValue(“i”, 1));//0—序号 i表示创建int型变量
    PyTuple_SetItem(pArgs, 1, Py_BuildValue(“i”, 2));
    PyTuple_SetItem(pArgs, 2, Py_BuildValue(“i”, 3));
    
    PyEval_CallObject(pFunc, pArgs); //调用函数,pArgs元素个数与被调函数参数个数一致
    

    字典传参

    PyObject *pDict = PyDict_New(); //创建字典类型变量
    PyDict_SetItemString(pDict, “Name”, Py_BuildValue(“s”, “Zhangsan”)); //往字典类型变量中填充数据
    PyDict_SetItemString(pDict, “Address”, Py_BuildValue(“s”, “BeiJing”));
    
    //将上述字典赋值给元组
    PyObject *pArgs = PyTuple_New(1);
    PyTuple_SetItem(pArgs, 0, pDict) 
    
    

    参数类型对照表

    Pythonc++
    s(string)[char *]
    s#(string)[char *, int]
    z(string or None)[char *]
    z#(string or None)[char *, int]
    u(Unicode string)[Py_UNICODE *]
    u#(Unicode string)[Py_UNICODE *, int]
    i(integer)[int]
    b(integer)[char]
    h(integer)[short int]
    l(integer)[long int]
    B(integer)[unsigned char]
    H(integer)[unsigned short int]
    I(integer/long)[unsigned int]
    k(integer/long)[unsigned long]
    L(long)[PY_LONG_LONG]
    K(long)[unsigned PY_LONG_LONG]
    n(int)[Py_ssize_t]
    c(string of length 1)[char]
    d(float)[double]
    f(float)[float]
    D(complex)[Py_complex *]
    O(object)[PyObject *]
    S(object)[PyObject *]
    N(object)[PyObject *]
    O&(object)[converter, anything]
    (items)(tuple)[matching-items]
    [items](list)[matching-items]
    {items}(dictionary)[matching-items]
    展开全文
  • python 3.5.5(基于anaconda环境) opencv 3.4.2 (早前就已经安装了,本文不会讲如何安装) Visual Studio 2015 硬件:DS-2CD3T56DWD-I5 相机SDK:CH-HCNetSDKV6.0.2.35_build20190411_Win64 准备工作: 之前...

    运行环境:

    Win10系统,64位,Anaconda3

    python 3.5.5(基于anaconda环境)

    opencv 3.4.2 (早前就已经安装了,本文不会讲如何安装)

    Visual Studio 2015

    硬件:DS-2CD3T56DWD-I5

    相机SDK: CH-HCNetSDKV6.0.2.35_build20190411_Win64


    准备工作:

    之前常常采用python来读取usb摄像头,因为其语言风格易读且上手快。起先,使用rtsp流来读海康的网络相机,视频画面出现延迟卡顿的现象,如果对于实时性要求较高(起码得和网页预览效果相当的帧率)的话,用rtsp流读取的方式显得不可取,本文采用在python中调用HikVision的SDK读取IP相机的方式实现,帧率的话和网络预览效果相当。

    python中调用C++形式的SDK, 首先是通过swig来封装需要的库。SDK给出的C++调用相机的实现算靠谱的了,所以尝试用该方法解决摄像头卡顿,画面延迟问题。参考了一些文章,都较为零零散散,因此想自己整理下分享给大家,包含了很多自己运行中出现的bug以及解决方法,具体步骤如下:

    1、海康SDK下载

    下载地址:https://www.hikvision.com/cn/download_61.html

    选择自己对应的系统平台版本,我这边选的是设备网络SDK_Win64  (CH-HCNetSDKV6.0.2.35_build20190411_Win64.zip文件) ; 解压后得到 CH-HCNetSDKV6.0.2.35_build20190411_Win64 文件夹;

    该文件夹下主要是头文件和库文件。

     

    2、安装OpenCV

    我安装的是OpenCV3.4.2;(安装方式参考其他文章)

    解压后的OpenCV需要将其bin路径添加到系统环境变量path下;

    3、安装将Swig

    Swig是用来封装库的,

    下载链接:http://www.swig.org/download.html

    我选择的是3.0.12这个早期版本,将其解压到如下目录:

    将 E:\App_install\swigwin-3.0.12路径添加到系统环境变量path中;

    4、下载boost库

    下载地址:https://www.boost.org/users/download/

    我选择的是 boost_1_70_0.zip (因为本文主要是将win10环境下的), 将其解压到待会工程需要用的路径下即可;此处随意解压到任意路径即可,待会会将解压后的文件夹拷贝到后面要说的路径下即可~

    5、下载OpenCV-swig接口文件

    下载地址:https://github.com/renatoGarcia/opencv-swig

    将其下载解压:

    我们主要会用到其目录下lib文件夹中的文件opencv文件夹和opencv.i接口文件(下文会提到如何使用,暂且解压就行)


    实现方案:

    1. 使用swig编译生成python和c++数据交换需要的.py和.cxx文件

    复制以下三个文件,保存到一个文件夹下,我将以下文件都放在 HicVision_python_SDK 新建文件夹下了

    HKIPcamera.h

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

    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 "plaympeg4.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;
    	for (row = 0; row < height; row++)
    	{
    		idx = row * widthStep;
    		int rowptr = row * width;
    
    		for (col = 0; col < width; col++)
    		{
    			tmp = (row / 2)*(width / 2) + (col / 2);
    	
    			Y = (unsigned int)inYv12[row*width + col];
    			U = (unsigned int)inYv12[width*height + width * height / 4 + tmp];
    			V = (unsigned int)inYv12[width*height + tmp];
    
    			outYuv[idx + col * 3] = Y;
    			outYuv[idx + col * 3 + 1] = U;
    			outYuv[idx + col * 3 + 2] = V;
    		}
    	}
    }
    
    //解码回调 视频为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
    
    		EnterCriticalSection(&g_cs_frameList);
    		//g_frameList.push_back(pImg);
    		g_frameList.push_back(cv::cvarrToMat(pImg));
    		LeaveCriticalSection(&g_cs_frameList);
    }
    
    
    ///实时流回调
    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_Play(nPort, hWnd))
    			{
    				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();
    }

    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"

    将上面提及的opencv-swig-master\lib下的opencv文件夹和opencv.i 这两个文件复制到 HicVision_python_SDK文件夹下,然后将解压的boost_1_70_0文件夹也一并拷贝到这个目录下了(其中test文件夹我也一并拷贝过来了,不确定有没有用到,理论上用不上,放着不管了~)

    使用如下指令:

    E:\Win32-MFC-Projects\HicVision_python_SDK>swig -IE:/App_install/opencv3_4_2/opencv/build/include -python -c++ HKIPcamera.i

     需要你cmd切到HicVision_python_SDK 这个文件夹下,然后用上面的指令,指定你opencv安装的头文件路径,会生成上图所示的HKIPcamera_wrap.cxx HKIPcamera.py 两个文件 (下文用到);


    2、修改海康SDK下的plaympeg4.h文件

    该文件在CH-HCNetSDKV6.0.2.35_build20190411_Win64 \ include 目录下:

    extern "C" __declspec(dllexport)"C"__之间需要增加空格,否则会导致编译报错。即:

     

    3、用VS2015编译生成动态链接库文件

    新建win32控制台应用 工程,取消选择"安全开发生命周期(SDL)检测";

    应用程序设置页参考如下:

    在资源方案管理器页将如下图所示的文件导入,即将上文提到的生成的文件拷贝到项目中(我这边起名为HKIPcamera项目名,建议一致);

    我编译的平台是release x64下的,因此将配置该平台环境的属性页

    其中VC++目录->包含目录中添加如下头文件路径:(请根据实际安装位置补全其全路径名称,我这边省去了安装路径名了~)

    Anaconda3\include
    Anaconda3\Lib\site-packages\numpy\core\include
    HicVision_python_SDK\boost_1_70_0
    CH-HCNetSDKV6.0.2.35_build20190411_Win64\include
    opencv3_4_2\opencv\build\include\opencv2
    opencv3_4_2\opencv\build\include\opencv
    opencv3_4_2\opencv\build\include
    

    其中VC++目录->库目录中添加如下库的路径:(自行补全实际安装全路径名)

    Anaconda3\libs
    HicVision_python_SDK\boost_1_70_0\libs
    CH-HCNetSDKV6.0.2.35_build20190411_Win64\lib
    CH-HCNetSDKV6.0.2.35_build20190411_Win64\lib\HCNetSDKCom
    opencv3_4_2\opencv\build\x64\vc14\lib
    

    预处理器->预处理器定义中内容如下:

    WIN32
    NDEBUG
    _CONSULE
    _CRT_SECURE_NO_WARNINGS

    且在通用属性->常规->字符集中选择使用多字节字符集(这个依据实际错误情况来修改,我是遇到这方面的问题,此处仅做补充)

    C/C++->代码生成->运行库选的是多线程DLL(/MD)

    链接器->输入->附加依赖项中添加: opencv_world342.lib  (release下是这个,debug下需要改为opencv_world342d.lib)

    HCNetSDK.lib
    GdiPlus.lib
    HCAlarm.lib
    HCCore.lib
    HCGeneralCfgMgr.lib
    HCPreview.lib
    PlayCtrl.lib

    完成以上步骤后,右键工程项目名选择生成,之后会在工程x64文件夹下的Release文件夹下生成.dll和.lib文件如下(红色):

    复制一份 HKIPcamera.dll 文件并重命名为 _HKIPcamera.pyd到该目录下,并将海康SDK中的 HCNetSDKCom 文件夹拷贝过来(这个步骤很重要!!!!),以及将上文中用swig生成的HKIPcamera.py 也复制过来(如上图蓝色)

    最后编写了个test.py也放在上图目录下,其内容如下(主要用来检测是否编译成功了):

    import HKIPcamera
    import time
    import numpy as np
    import matplotlib.pyplot as plt
    import cv2
    
    
    ip = str('10.167.93.111')  # 摄像头IP地址,要和本机IP在同一局域网
    name = str('admin')       # 管理员用户名
    pw = str('abcd1234')        # 管理员密码
    HKIPcamera.init(ip, name, pw)
    # HKIPcamera.getfram()
    #for i in range(100):
    while(True):
        t = time.time()
        fram = HKIPcamera.getframe()
        t2 = time.time()
        cv2.imshow('123', np.array(fram))
        cv2.waitKey(1)
        print(t2-t)
        time.sleep(0.1)
    HKIPcamera.release()
    time.sleep(5)
    HKIPcamera.init(ip, name, pw)

    在anaconda的prompt控制台下运行该test.py,会看到python调用SDK的实时画面,其延迟性同网页预览版差不多。但比rtsp流读取的效果好很多~

    至此成功!


    相关错误以及解决方案:

    一.无法打开 python35_d.lib 的问题

    参考:https://blog.csdn.net/zhuxukang/article/details/79614335

    在Anaconda3->libs目录下只有python35.lib,即我们安装的python3.5是非调试版,因此编译时最好用release版的,解决方法1:将python35.lib复制一份并重命名为python35_d.lib保存到相同目录下(我试了不可行,可能你可尝试);

    解决方法2:在Anaconda3->include下找到pyconfig.h文件,对其做如下修改:

    注释掉(358-360的内容);更改315行内容;

    二. 不能将参数 1 从“const char [12]”转换为“const wchar_t *”

    报错的位置是下图,网上https://blog.csdn.net/yeahoodfox/article/details/42172729 的解决方式是在属性页中设置字符集为未设置,可无法解决我的问题,索性我将其注释掉了~没问题。

    三.AttributeError: module 'HKIPcamera' has no attribute 'init'

    在运行test.py时你会遇到这个问题,那么你需要将SDK的HCNetSDKCom 文件夹拷贝到test.py所在文件路径下。

    四:1>pythonIniti.obj : error LNK2019: 无法解析的外部符号 __imp___Py_NegativeRefcount,该符号在函数 "public: __thiscall boost::python::api::object_base::~object_base(void)" (??1object_base@api@python@boost@@QAE@XZ) 中被引用
    1>pythonIniti.obj : error LNK2001: 无法解析的外部符号 __imp___Py_RefTotal

    解决方法是:修改头文件object.h,注释掉第56行:注释掉pyconfig.h中的define Py_DEBUG

    (参考:https://www.jb51.net/article/108588.htm)

     

     

     

    参考:Python调用海康SDK实时显示网络摄像头   和 Windows下Python调用海康SDK实时显示网络摄像头(这两文章在讲如何生成动态链接库时就一笔带过~)

               Python调用C++函数 (有助于理解swig的用法)

               linux下python调用海康SDK实时显示网络摄像头 (本文借鉴了其test.py程序,用来最后验证调用可行性

              HikVison SDK: C++ 至Python (这篇写的真不错,推荐)

     

    展开全文
  • .bat批量处理文件,得到输出结果。Windows系统下如何使用python调用.bat,得到结果,输出到TXT。
  • Python调用cmd

    万次阅读 多人点赞 2019-06-03 16:35:06
    Python经常需要用作系统脚本,调用cmd或者shell能够大大提高工作效率。 1. os.system 使用os.system是最简单直观的调用方法: import os cmd = 'ls' os.system(cmd) 这个方法虽然简单,但有一个极大的缺点,...

    Python经常需要用作系统脚本,调用cmd或者shell能够大大提高工作效率。


    1. os.system

    使用os.system是最简单直观的调用方法:

    import os
    cmd = 'ls'
    os.system(cmd)

    这个方法虽然简单,但有一个极大的缺点,无法获得cmd命令的输出。很难做进一步操作。对于'mv','cp'这种没有输出的命令行,可以首先推荐使用这个方法。而对于'ls','echo'等有输出的命令行,这个方法就不推荐使用了。

    博主推荐指数:★★★★☆


    2. os.popen

    同样基于os模块来调用,但os.popen可以以字符串形式获得shell下的输出,实现如下:

    import os
    cmd = 'ls'
    res = os.popen(cmd)
    output_str = res.read()   # 获得输出字符串
    print(output_str)

     使用os.popen可以获得输出,而且操作相对也比较简便。

    博主推荐指数:★★★★★


    3. subprocess.Popen

    这种方法略复杂,而且目前还没有发现有什么太大的优势,所以本文不予介绍。等以后发现这种方法的优势时,博主再来加以补充。

     

    展开全文
  • 这个cpp的功能是 “加法器”,extern “C”的存在是因为python 的ctype可以调用C但是没有Cplustype~~~所以,~~~ #include "/home/oujie/anaconda3/envs/pytorch-master/include/python3.7m/Python.h" #...

    一、写一个cpp

    这个cpp的功能是 “加法器”,extern “C”的存在是因为python 的ctype可以调用C但是没有Cplustype~~~所以,~~~

    #include "/home/oujie/anaconda3/envs/pytorch-master/include/python3.7m/Python.h"
    
    #功能实现在这个函数中
    extern "C"
    int add_func(int a,int b)
    {
        return a+b;
    }
    
    #下面的这些是调用相关的API把数据格式进行转换,让python可以调用,这也是python的头文件里面的定义好的
    
    extern "C"
    static PyObject *_add_func(PyObject *self, PyObject *args)
    {
        int _a,_b;
        int res;
    
        if (!PyArg_ParseTuple(args, "ii", &_a, &_b))
            return NULL;
        res = add_func(_a, _b);
        return PyLong_FromLong(res);
    }
    
    extern "C"
    static PyMethodDef CppModuleMethods[] =
    {
        {
            "add_func",
            _add_func,
            METH_VARARGS,
            ""
        },
        {NULL, NULL, 0, NULL}
    };
    
    extern "C"
    PyMODINIT_FUNC initcpp_module(void)
    {
        (void) Py_InitModule("cpp_module", CppModuleMethods);
    }

    二、对上面的这个CPP编译

    #linux下面编译成so
    gcc -o add_demo.so -shared -fPIC add_demo.c
    
    #windows下编译成dll

    三、写一个python文件调用

    import ctypes
    dll=ctypes.cdll.LoadLibrary
    lib=dll("./add_demo.so")
    print("python call cpp so:")
    p=lib.add_func(2,3)
    print(p)

     

    展开全文
  • python3调用cpp的方法——python调用so

    万次阅读 2019-09-22 23:19:07
    python中使用ctypes模块可以在python中直接调用C/C++。 首先要将C/C++编译成动态库(.so),之后python调用即可 特别注意在调用C++函数需要在函数声明时,加入前缀“ extern “C” ”,这是由于C++支持函数重载...
  • 1.python调用dll,必须客观根据dll原文件中声明的对应方式调用; 每个函数的入参和出参类型必须客观的根据原函数的入参和出参类型进行设置转化; 如果不清楚原函数出入参的类型,就不要谈python调用dll文件啦; ...
  • python调用PHP

    千次阅读 2017-09-09 21:00:12
    python调用PHP
  • python调用webservice

    千次阅读 2019-05-21 20:16:50
    python调用webservice的两种方法suds调用requests调用 因为工作关系,长期对接各种三方的接口(视图,webservice,队列)。期间遇见了各种报错,也查阅了许多资料,特此记录webservice对接领域长期以来积累的经验,...
  • Python调用C++程序的几种方法

    万次阅读 多人点赞 2018-07-20 15:43:58
    大家都知道Python的优点是开发效率高,使用方便,C++则是运行效率高,这两者可以相辅相成,不管是在Python项目中嵌入C++代码,或是在C++项目中用Python实现外围功能,都可能遇到Python调用C++模块的需求,下面列举出...
  • Python调用Matlab代码

    千次阅读 2017-08-25 09:51:27
    Python调用Matlab代码 参考文献 [1]Python调用Matlab代码(matlab官网)
  • Python调用Matlab

    千次阅读 2019-01-03 14:07:58
    Python调用Matlab Python的应用越来越广泛,在深度学习,机器学习,数据挖掘等方面有很大的优势,并且python是开源的有强大的第三方库,这是python的最大优势。但是MATLAB在科学计算方面优化的非常极致,特别是...
  • python调用jar包

    万次阅读 2019-06-15 10:15:59
    原理:使用python调用第三方库jpype启动虚拟机调用jar包中非静态和静态方法 环境准备 需要确定安装版本的位数,python、jre、jpype应一致 1.jre 下载地址https://www.java.com/en/download/manual.jsp,下载后...
  • Python调用C++代码

    千次阅读 2018-09-07 06:13:23
    Python调用C++代码 今天在研究PyTorch中Tensor的一些操作的时候,发现其底层Tensor的操作都是用C++写的,并使用pybind11进行C++和Python的桥接。所以,我就想着探索一下Python中如何调用C++代码? 可行方案 ...
  • python 调用 C++ code

    万次阅读 2015-10-24 02:33:10
    1. 如果没有参数传递从python传递至C++,python调用C++的最简单方法是将函数声明为C可用函数,然后作为C code被python调用,如这里三楼所示; 2. 有参数传递至C++函数,swig是最便捷的调用方法,以下面这个工程所示...
  • python调用C++ 程序

    千次阅读 2019-03-20 15:53:21
    1 python调用C++ 可执行程序 exe 并传递参数 C++文件 #include<iostream> #include<string.h> using namespace std; //该文件名称:cpptest.cpp //终端下编译指令: //g++ -o cpptest cpptest.cpp int ...
  • Python调用DLL

    千次阅读 2015-12-11 19:35:24
    python调用dll时需要根据不同的调用约定而使用不同的函数。但是不管什么调用,最后都必须用extern “C”来防止名字粉碎。 dll源文件: [cpp] view plaincopy #include 
  • python 调用Windows API

    千次阅读 2019-02-19 09:52:39
    #python 调用Windows API(使用IDLE开发环境) from ctypes import * msvcrt = cdll.LoadLibrary('msvcrt') for i in 'love': msvcrt.printf(i)   #python 调用Windows API(使用VS开发环境) from ctypes import...
  • python如何调用图片-python调用图片

    千次阅读 2020-11-01 13:08:32
    python本身也有识别图片转文字的框架,但是相比调用接口,识别的精度就略显不行了; 这是 百度ai 的网站: https:ai.baidu.com ; 点击右上角的 控制台 ,申请或者登陆; 进去之后左侧有 【文字识别】: ? 点击【创建...
  • python调用java代码方法

    热门讨论 2010-08-23 21:43:11
    python 调用java代码方法
  • Python调用Java与Java中调用Python

    千次阅读 2018-05-01 10:18:05
    Python调用Java 参考: JPype:实现在python调用JAVA 1.安装 首先系统中Python和Java版本最好都是32位或者都为64位,否则可能出现错误。 pip install jpype1 可能需要安装VC for python27:...
  • python调用R语言

    万次阅读 2016-01-26 14:47:50
    R语言有很强大的统计绘图函数,python的开发能力强,数据处理速度比R快。在平时使用python处理数据,使用R统计分析。于是想着怎么使用python来调用R,毕竟python还不能取代R,它们是...python调用R的模块是rpy2。
  • python调用java完整教程

    万次阅读 2018-10-11 21:35:00
    由于 python 本身为脚本语言,且经常存在调用第三方库的情况,有的时候用 java 调用 python 不如用 python 调用 java 方便。下面就整理一下在 python 调用 java 过程中需要哪些操作。(默认是 linux 的 Ubuntu 上调...
  • Python调用WebService接口实例
  • 一、Python调用dll文件 DLL:动态链接库,用来与其他语言进行交互。 多数情况下是带有.dll扩展名的文件,也可能是.ocx等,linux系统通常是.so文件。 1、vs创建项目 打开vs,新建win32项目, 点击完成。 2、vs已经...
  • python 调用c++

    千次阅读 2017-05-23 12:00:11
    找了一些python调用c++的方法,发现Python提供了ctypes这个包,可以很容易的使用Python直接调用C语言实现的接口,这使得开发的工作量大大降低,只是ctypes是基于libffi实现的跨语言封装,性能上可能会比使用C ...
  • windows下python调用dll的方法

    千次阅读 2019-12-29 15:48:54
    windows下python调用dll的方法VS生成dll可供python调用的dll生成python调用dll方法传入实数demo传入指针demo1传入指针demo2传入字符串demo传入字符串指针并返回字符串demo完整代码 VS生成dll 关于VS生成dll文件供另...
  • python调用hbase

    千次阅读 2016-07-19 20:38:25
    python调用hbaseHBaseHBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所...
  • python调用dll

    千次阅读 2018-06-05 10:56:33
    Python与dll的交互如果不知道如何生成dll,可以看我另一篇文章https://blog.csdn.net/baidu_30174103/article/details/805149251. 加载dll(dll的位数和python版本需要对应)2.int ADD(int a,int b)的调用3.int ...
  • python调用c# dll pythonnet使用

    万次阅读 热门讨论 2018-03-21 16:57:43
    最近需要使用python去调用C#封装的dll如果是c++写的dll 我们可以使用ctypesc#可以是pythonnetpython还有专门的ironpython调用c#我使用了pythonnet下载安装完成以后import clrimport syssys.path.append("...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 959,641
精华内容 383,856
关键字:

python调用网址

python 订阅