最通俗易懂的封装C/C++代码为Python模块【附OpenCV-Mat转换方法】

CTP_将C++封装为Python可调用接口 使用pybind11和setuptools的方式封装CTP接口为python可调用 阅读详情
AI摘要

本文详细介绍如何使用C++扩展Python功能,包括创建C++模块、实现数据类型转换及调用流程,特别聚焦于OpenCV图像处理的跨语言应用。

本文教程参考自微软官方文档:创建适用于 Python 的 C++ 扩展

前言背景

看了好多人写的方法,最后发现只有在微软官网文档上找到的方法最可行。封装C++代码主流方法都是封装成dll文件调用。

首先我们必须明白为什么我们能在Python里面调用C++的方法,因为我们主流使用的Python解释器是C写的,为了区别开用其他语言实现的python,为此我们通常叫它Cpython,可以理解为:用C实现的python。

使用 C/C++编写的模块常用于扩展 Python 解释器的功能和启用对低级别操作系统功能的访问。 主要有以下 3 种类型的模块:

  • 加速器模块:Python 是一种解释型语言,某些代码段可使用 C++ 进行编写来提高性能。
  • 包装器模块:向 Python 代码公开现有 C/C++ 接口,或公开易于通过 Python 使用的更“Python 化”的 API。
  • 低级别系统访问模块:用于访问 CPython 运行时的较低级别功能、操作系统或基础硬件。

环境准备

VS环境:VS2019/2017/2015
Python环境:原生的Python3.6(非Anaconda)

实现最基础的C2Python接口

先创建一个空的C++项目

第一步:创建完成后,在新项目中创建 C++ 文件,选择“添加” > “新建项”,选择“C++ 文件”,将其命名为 module.cpp。

第二步:右键单击“解决方案资源管理器”中的 C++ 项目,然后选择“属性”。

第三步:在显示的“属性页”对话框顶部,将“配置”设置为“所有配置”,并将“平台”设置为“x64”(根据你的项目需求选择平台)
在这里插入图片描述
第四步:如下表配置属性:
在这里插入图片描述
在这里插入图片描述
第六步:生成,按照上面配置无误不会出现报错

第七步:编写C++函数:
实现一个对自增300的函数C_func

#include <Windows.h>
#include <cmath>
#include <Python.h>

//我们即将在python里面调用这个函数
PyObject* C_Func(PyObject*, PyObject* o) { //o是python对象,Cpython接口利用Pyobject进行数据交互
    double x = PyFloat_AsDouble(o); //把Pyobject转换为double,因为在python以浮点数的形式传进来的
    double result = x + 300;
    return PyFloat_FromDouble(result);//然后把C++的double转回PyObject
}

static PyMethodDef superfastcode_methods[] = {
    { "Py_Func", (PyCFunction)C_Func, METH_O, nullptr }, //Py_Func 是在python里面引用的名字
    { nullptr, nullptr, 0, nullptr }
};

static PyModuleDef superfastcode_module = {
    PyModuleDef_HEAD_INIT,
    "C2Python",            // Module name to use with Python import statements 模块的名字
    "Module description",  // Module description 模块信息描述
    0,
    superfastcode_methods  // Structure that defines the methods of the module
};

PyMODINIT_FUNC PyInit_C2Python() {
    return PyModule_Create(&superfastcode_module);
}

打开生成目录,找到以pyd结尾的文件,这是编译出来的二进制文件
在这里插入图片描述
第八步:在同个目录下,创建一个python文件:xxxx.py
代码如下:

import C2Python

a=C2Python.Py_Func(100) #Py_Func 这个函数名字是在C++的PyMethodDef里面写的
print(a)

输出:400.0
至此,调用成功。

C++的Opencv的Mat类型转Python的numpy数组

我们知道在C++里面的opencv定义了一个独一无二的Mat类,和opencv-python里面直接使用numpy数组是有差异的。Cpython里面提供的接口可以交互的数据类型:int,float,bytes。所以,我们进行数据交互只能用bytes类型。网上不少文章的方法会出现内存读取错误,如果我们按照元数据作为字节数据转换很有可能会出现问题。我们可以从网络图片数据传输方法得到灵感,使用Base64编码进行数据交互。

第一步:头文件声明

创建一个Trans.hpp,代码如下:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string.h>
#include<algorithm>
#include<opencv.hpp>
using namespace cv;
using namespace std;

Mat Base2Mat(string& base64_data);
string Mat2Base64(const Mat& img, string imgType);
char* string2char(string code);
第二步:写C++传输类

我们创建一个新的Cpp文件:Trans.cpp,用于辅助数据传输(保证当前项目已经进行正确的opencv环境配置)

#include "Trans.hpp"
string base64Decode(const char* Data, int DataByte)
{
	//解码表
	const char DecodeTable[] =
	{
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
		62, // '+'
		0, 0, 0,
		63, // '/'
		52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // '0'-'9'
		0, 0, 0, 0, 0, 0, 0,
		0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
		13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, // 'A'-'Z'
		0, 0, 0, 0, 0, 0,
		26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
		39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, // 'a'-'z'
	};
	//返回值
	string strDecode;
	int nValue;
	int i = 0;
	while (i < DataByte)
	{
		if (*Data != '\r' && *Data != '\n')
		{
			nValue = DecodeTable[*Data++] << 18;
			nValue += DecodeTable[*Data++] << 12;
			strDecode += (nValue & 0x00FF0000) >> 16;
			if (*Data != '=')
			{
				nValue += DecodeTable[*Data++] << 6;
				strDecode += (nValue & 0x0000FF00) >> 8;
				if (*Data != '=')
				{
					nValue += DecodeTable[*Data++];
					strDecode += nValue & 0x000000FF;
				}
			}
			i += 4;
		}
		else// 回车换行,跳过
		{
			Data++;
			i++;
		}
	}
	return strDecode;
}
string base64Encode(const unsigned char* Data, int DataByte)
{
	//编码表
	const char EncodeTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	//返回值
	string strEncode;
	unsigned char Tmp[4] = { 0 };
	int LineLength = 0;
	for (int i = 0; i < (int)(DataByte / 3); i++)
	{
		Tmp[1] = *Data++;
		Tmp[2] = *Data++;
		Tmp[3] = *Data++;
		strEncode += EncodeTable[Tmp[1] >> 2];
		strEncode += EncodeTable[((Tmp[1] << 4) | (Tmp[2] >> 4)) & 0x3F];
		strEncode += EncodeTable[((Tmp[2] << 2) | (Tmp[3] >> 6)) & 0x3F];
		strEncode += EncodeTable[Tmp[3] & 0x3F];
		if (LineLength += 4, LineLength == 76) { strEncode += "\r\n"; LineLength = 0; }
	}
	//对剩余数据进行编码
	int Mod = DataByte % 3;
	if (Mod == 1)
	{
		Tmp[1] = *Data++;
		strEncode += EncodeTable[(Tmp[1] & 0xFC) >> 2];
		strEncode += EncodeTable[((Tmp[1] & 0x03) << 4)];
		strEncode += "==";
	}
	else if (Mod == 2)
	{
		Tmp[1] = *Data++;
		Tmp[2] = *Data++;
		strEncode += EncodeTable[(Tmp[1] & 0xFC) >> 2];
		strEncode += EncodeTable[((Tmp[1] & 0x03) << 4) | ((Tmp[2] & 0xF0) >> 4)];
		strEncode += EncodeTable[((Tmp[2] & 0x0F) << 2)];
		strEncode += "=";
	}
	return strEncode;
}

string Mat2Base64(const Mat& img, string imgType)
{
	//Mat转base64
	string img_data;
	vector<uchar> vecImg;
	vector<int> vecCompression_params;
	vecCompression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
	vecCompression_params.push_back(90);
	imgType = "." + imgType;
	imencode(imgType, img, vecImg, vecCompression_params);
	img_data = base64Encode(vecImg.data(), vecImg.size());
	return img_data;
}
Mat Base2Mat(string& base64_data)
{
	Mat img;
	string s_mat;
	s_mat = base64Decode(base64_data.data(), base64_data.size());
	vector<char> base64_img(s_mat.begin(), s_mat.end());
	img = imdecode(base64_img,CV_LOAD_IMAGE_COLOR);
	return img;
}

char* string2char(string code)
{
	char* dst = new char[strlen(code.c_str()) + 1];
	strcpy(dst, code.c_str());
	return dst;
}
第三步:写C++主函数

然后,我们在moudle.cpp里面写:

#include"Trans.hpp"
#include <Python.h>

Mat Process(Mat src) // Here is your opencv program
{
    Mat Img = src;
    return Img;
}


PyObject* C_Func(PyObject*, PyObject* o) {
    string Matcode = PyBytes_AsString(o);
	Mat src_img = Base2Mat(Matcode);
    Mat tar_img=Process(src_img); // Here is your opencv program
    string code=Mat2Base64(tar_img,"jpg");
    char *dst = string2char(code);
    return PyBytes_FromString(dst);
}


static PyMethodDef code_methods[] = {  
    { "Py_Func", (PyCFunction)C_Func, METH_O, nullptr},
    { nullptr, nullptr, 0, nullptr }
};


static PyModuleDef code_module = {
    PyModuleDef_HEAD_INIT,
    "C2Python",                        
    "Here is your moudle details", 
    0,
    code_methods 
};

PyMODINIT_FUNC PyInit_downBH() {
    return PyModule_Create(&code_module);
}

第四步:调用

然后生成,在有pyd文件的目录下,创建一个xxxxx.py,代码如下:

import C2Python
import base64
import cv2
import numpy as np

def decode_base64(base64_data):  
    img = base64.b64decode(base64_data)
    nparr = np.fromstring(img, np.uint8)
    img_np = cv2.imdecode(nparr, 1)
    img_np=cv2.cvtColor(img_np,cv2.COLOR_BGR2RGB)
    return img_np

def __img2base64Bytes(img):
    x = cv2.imencode(".jpg",img)[1].tobytes()
    base64_data = base64.b64encode(x)
    return base64_data

img=cv2.imread('D:/1.jpg')
base64_data=__img2base64Bytes(img)

buf=C2Python.Py_Func(base64_data) # Here is your C++ func
re_img=decode_base64(buf) #return bytes so you need to decode

cv2.imshow('Preview',re_img)
cv2.waitKey(0)

至此,完成C++封装的所有任务。

在一台没有opencv的电脑上调用

我们在opencv的build目录里面找到类似:opencv_world346.dll的文件,把他复制到跟pyd一个目录下,就能完成调用了。目录结构如下:
在这里插入图片描述

Python中的opencv与C++中的opencv图像数据转换 1.c++调用python的步骤 初始化python 加载对应模块(使用dict和直接调用) 加载对应函数3.1使用类还要对类进行实例化 将参数封装为Python元组类型 传入参数到元组 获取并根据Python函数的定义解析返回值 2.直接上代码进行注释 #include <python2.7/Python.h> //python与c++的接口在这个头文件里 #include <iostream> #include <opencv2/core/core.hpp 阅读详情

相关推荐

c++调用python接口_C++调用Python3接口

通过在C++程序调用Python3所提供的C接口可以实现调用Python程序所实现的功能。在C++调用深度学习训练好的模型时,如果不使用一些部署手段,这种C++调用Python接口的方式虽然大大牺牲了效率,但是可以说是也是一种取巧的方法。这里记录一下C++如何去调用Python3的接口,作为一个总结。操作系统:Ubuntu16.04构建工具:CMake要想在 C++ 中调用 Python3 ,必须...

weixin_39924307的博客 1278

封装C++函数成DLL给Python工程调用

跨语言

qq_44874691的博客 1640

Python:SWIG编译C++接口

问题来源 SeetaFaceEngine使用C++编译,而且使用OpenMP技术和向量化技术进行加速,已经基本可以满足业界对人脸识别功能的需求。在项目中用到人脸识别 功能,OpenCV自带的基于Haar特征的算法,效果不理想,仅仅能够识别正脸,人脸歪一定的角度都不能够识别。使用SeetaFaceEngine需要重新编译python接口,对于没有接触过的人来说还真不简单,在此新路记录。 Seeta...

DeepIndeed 1244

Boost(3):将c++类封装成python类

简单介绍了如何使用Boost.Python将c++语言的class及其成员变量和成员函数封装成python语言课调用的实例。

翔底的博客 4898

C++ OpenCV DNN模块部署YOLO ONNX模型:从环境配置到推理实现完整指南

在计算机视觉工程实践中,模型部署是将训练好的算法应用于实际生产环境的关键环节。其核心原理在于通过推理框架加载和运行模型,将输入数据转换为预测结果。ONNX(Open Neural Network Exchange)作为一种开放的模型格式,为实现跨平台、跨框架的模型部署提供了通用解决方案,具有重要的技术价值。OpenCV的DNN模块作为一个轻量级、高效的推理引擎,能够无缝集成ONNX模型,尤其适用于C++环境下的边缘计算和嵌入式视觉应用场景。本文聚焦于解决C++项目中利用OpenCV DNN模块部署YOLO

weixin_34297704的博客 384

python调用c++之pybind11

2、此demo中曾尝试将opencv的Mat作为参数传入到c++代码中,即被注释掉的下列一行。编译生成.pyd和lib。测试过程中存在的部分问题。

2401_84010836的博客 862

C/C++代码封装为Python模块(含OpenCV-Mat转换)

准备资料 Ubuntu16.04或者其他版本 Python2.x或者Python3.x boost_1_69_0或者其他版本 // https://www.boost.org/users/history/version_1_69_0.html OpenCV3.4.3或者其他版本 // https://www.opencv.org/releases.html pyboostcvconver...

楷尘·极客 7210

OpenCV项目开发实战--如何读取图像(Python、C++)代码实现

详细介绍了在 OpenCV 中读取图像(Python、C++)代码实现

DT程序员的博客 547

OpenCV 4 从安装到选型:模块、Mat与避坑实战

图像处理与计算机视觉的核心,是把图像当作矩阵进行读写、滤波、变换与特征分析。OpenCV 作为经典开源视觉库,以 cv2 模块提供从 imread、cvtColor 到 DNN 推理的底层算子,并通过 Mat 这一头数据分离的矩阵容器实现高效内存共享与 ROI 操作。其价值在于跨平台、免编译开箱即用,且 Apache 2.0 许可对商用友好,广泛用于工业检测、人脸门禁、摄像头颜色识别和轻量模型部署。实际落地时,opencv-python 安装、Anaconda 环境隔离、pip 与 conda 混用、模块缺

weixin_34082854的博客 367

一步一步介绍如何将 OpenCV C++ 代码转换为 Python 模块

本文将详细的一步一步介绍如何将 OpenCV C++ 代码转换为 Python 模块,并附源码供下载

DT程序员的博客 550

C++/OpenCV/Qt实战:图像处理软件完整项目开发笔记

图像处理是计算机视觉的基础技术之一,核心包括灰度化、二值化、均值滤波与边缘检测等经典算法。在实际工程中,如何将这些算法嵌入一个可交互的桌面应用,比单纯调用算法函数更具挑战。通过C++与OpenCV处理图像数据,结合Qt构建信号槽驱动的GUI界面,可以搭建出性能优异、架构清晰的图像处理软件。技术栈涵盖cv::Mat与QImage的无缝转换、多线程异步处理、自适应阈值调参等关键环节,广泛应用于工业视觉检测、课程设计及上位机开发等场景。本文以一套功能完整的图像处理项目为例,围绕技术选型、整体架构、核心算法实现、环

weixin_30780649的博客 463

Windows 11下用PyBind11封装OpenCV C++为pip安装包

Python与C++混合开发中,如何将高性能OpenCV图像处理逻辑无缝集成到Python生态,是工业视觉、AI推理等场景的核心诉求。其本质是ABI兼容性问题:Python解释器、OpenCV二进制库、PyBind11绑定层三者必须在Windows原生环境下严格对齐。关键技术路径包括Anaconda环境作为ABI锚点、CMake精准定位OpenCV Config.cmake、PyBind11_opencv插件启用cv::Mat与numpy.ndarray自动转换,以及DLL路径链的显式注入。本文聚焦Wind

weixin_33834137的博客 395

COMSOL中的动网格

首先我们先了解几个概念 (1)网格重划分(remesh):就是在某些特定的区域进行网格的重新划分,在Maxwell软件中的直线运动区域,当运动物体运动后,这个区域进行重新划分。 (2)morph:网格不重新划分,小范围的进行网格变形,针对运动物体运动位移较小,对变形区域不进行重划分,能够提高效率。 (3)网格滑移(sliding):针对圆形运动区域,运动与非运动区域进行网格滑移,当然边界上两侧网格不共节点,该方法不需要网格重新划分,大部分软件针对圆形运动区域采用该方法,比如maxwell的band,b

midiio的博客 7868

OpenCV C++实战:从环境配置到工程化封装图像处理类

计算机视觉是人工智能领域的关键技术,其核心在于通过算法让计算机“看懂”图像与视频。OpenCV作为开源计算机视觉库,提供了丰富的图像处理、分析与机器学习算法,是实现视觉应用的基石。在追求高性能、低延迟的嵌入式或工业场景中,C++因其执行效率与资源控制优势成为首选。通过面向对象编程思想,将零散的图像处理函数封装成可复用的类,能显著提升代码的模块化与可维护性,这是从脚本编写迈向工程化开发的关键。本文以OpenCV C++为工具,详细解析了从环境搭建、核心对象操作到设计可配置视觉流水线的完整路径,并针对Mat对象

weixin_33806300的博客 320

将点云坐标转换成世界坐标的demo

将点云坐标转换成世界坐标的demo

howard789的博客 2206

海上AI导航系统:技术架构与行业应用解析

计算机视觉与强化学习技术在海上导航系统中的应用正逐步改变传统航运业。通过多模态传感器融合技术,现代AI导航系统能够实现高精度的物体识别与实时路径规划,有效解决能见度依赖、决策延迟等核心痛点。以Orca AI的SeaPod系统为例,其结合了NVIDIA GeForce RTX 4070的边缘计算能力与多光谱协同识别技术,在恶劣环境下仍能保持稳定性能。这类系统不仅提升了航行安全性,还通过优化航线显著降低燃油消耗,在东京湾、马六甲海峡等繁忙水域展现出巨大价值。随着毫米波雷达融合方案的测试推进,未来海上导航将突破极

weixin_33597080的博客 354

python c 混合编程 github_ubuntu下C++与Python混编,opencv中mat类转换

C++ 与 Python 混编因为赶项目进度,需要使用到深度学习的内容,不过现有的深度学习框架大多使用python代码,对于不会改写C++的朋友来说,需要耗费大量的时间去改写,因此,使用python与C++混编可以快速的查看效果,并作出选择。在c++中使用混编python需要用到基础头文件Python.h,最好需要使用boost中的python,boost将底层python重新封装,更好的使用c+...

weixin_39626181的博客 422

ScanNetV2 数据集讲解和选择性下载

写在前面的话: 不可转载!!!!!!!!!!!! ScanNetV2一共1.2T,数据太大本文会简单讲解如何下载自己想要的文件,并附上修改后的下载程序 ScanNetV2:http://www.scan-net.org/ 简介 ScanNetV2的作者是斯坦福大学的博士,其团队通过收集RGB-D的视频序列,通过ipad应用加深传感器而收集的,然后视频会被上传到服务器,并被自动重建。然后,视频会被给到亚马逊 Mechanical Turk,将标注工作众包出去。ScanNetV2是RGB-D数据集,.

qq_35781447的博客 2万+

OpenCV 核心 API 导读:从模块化结构到 Mat 内存管理与类型系统的设计原理

> 本文面向希望在 OpenCV(本仓库为 **5.1.0-dev** 主线源码)中使用 C++ API 的开发者。它以 [modules/core/doc/intro.markdown](https://link.gitcode.com/i/2972172f5d90ec9a762fbf156b5394f0) 这篇库内总导读为主线,系统讲解 OpenCV 的模块化组成,以及贯穿全库的 `cv` 命

gitblog_00385的博客 603

akamai3简单分析

akamai流程的简单分析

记录一些web逆向的过程 916

2024年软考信息安全工程师备考历年真题汇总

信息安全工程师分属“信息系统”专业,位处中级资格,2016年下半年,第一次开考信息安全工程师(中级)考试。目前每年考试一次。已开考六次,2016年11月12日,2017年5月20日,2018年5月26日,2019年5月25日,2020年11月7日,2021年11月6日为第六次考试。 第五次和第六次考试,采用第二版教材。 2024年软考信息安全工程师备考历年真题汇总

月梦工作室 5100

OpenCV 4 入门指南:模块架构、环境搭建与图像处理代码实战

计算机视觉的核心,是把图像视为像素矩阵并对其执行数学运算。滤波、边缘检测、几何变换等操作,本质上都是围绕矩阵与通道的数值计算。OpenCV 将这些运算封装为跨平台函数库,兼顾 C++ 性能与 Python 迭代效率,并逐步强化 DNN 推理能力。它常用于摄像头采集、颜色识别、工业检测和深度学习预处理。理解 Mat 的内存布局、模块分工与版本差异,是避开环境配置和性能陷阱的关键。OpenCV 4 进一步统一语言与模块路线,从源码编译、pip/conda 安装到第一段读写与识别代码,构成一条可复用的图像处理入门

weixin_34347651的博客 344

压缩包密码破解工具ZIP Cracker2.0.1.2 正式版

一款多功能文件密码破解工具,支持ZIP、RAR、Office等主流加密格式,提供CPU/GPU双模式破解。该软件采用黑客风格界面,具备环境自检修复功能,支持实时监控硬件使用率。内置hashcat等专业破解工具,通过拖拽文件即可快速破解,GPU模式速度可达CPU的10-100倍。最新版本优化了中文路径支持,并提升了启动速度。

bfq05234214的博客 480

OpenCV 4 入门指南:环境配置、Mat 原理与图像处理实战

OpenCV 是开源计算机视觉与图像处理库,核心是以 Mat 承载图像矩阵,围绕模块化算子完成读写、滤波、颜色空间与特征分析。理解 Mat 的浅拷贝、BGR 排列和类型尺寸,是避免工程报错的关键。它的价值在于把工业检测、目标追踪、人脸识别等高频需求沉淀为可复用函数,尤其适合用 opencv python 快速验证、opencv c++ 部署落地。典型场景包括 opencv 颜色识别、摄像头轮廓分析、基于 STM32 与 OpenCV 的多模式舵机云台目标追踪等。围绕 OpenCV 4 的入门与排错,从环境搭

weixin_33845881的博客 454

从 VL02N 拣配到 ABAP 自动化,读懂 SD_DELIVERY_UPDATE_PICKING 的位置和风险

文章摘要:SAP SD模块中,SD_DELIVERY_UPDATE_PICKING函数模块用于处理出库交货单的拣配确认,更新交货项目的拣配数量。该函数适用于未启用WM/EWM的传统SD流程,能确保拣配状态与标准交货处理逻辑同步,比直接修改数据库更安全。但在S/4HANA Cloud等新环境中,应优先使用API_OUTBOUND_DELIVERY_SRV等公开发布接口。使用该函数时需注意参数完整性和按交货单整体处理的原则,避免逐项提交导致的数据不一致问题。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 243

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

OpenCV C++封装Python接口:零拷贝高性能绑定实战

OpenCV作为最主流的计算机视觉库,其C++版本在性能与硬件适配性上具有不可替代优势,而Python生态则在算法开发、服务部署和快速迭代中占据主导地位。实现二者高效协同,本质是解决跨语言内存共享、类型系统对齐与资源生命周期管理三大核心问题。其中,cv::Mat与numpy array的零拷贝桥接直接决定图像处理吞吐上限;RAII机制穿透保障内存安全,避免常见引用计数泄漏;pybind11凭借对C++11/14特性的深度支持,成为当前工程落地中最稳定、最轻量的绑定方案。本文聚焦真实工业级封装路径,覆盖接口设

weixin_34116482的博客 239

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: Python 五行代码实现类似全能扫描王和office Lens的扫描彩色增强滤镜效果
下一篇: 线性代数从零开始详解笔记【向量】
JintuZheng
博客等级 码龄11年 1483粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值