欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++移植python模型及中间参数

程序员文章站 2022-03-27 10:08:40
C++中如何调用python 中numpy数组——xml文件Python中写入xml文件:arr = np.random.random((10, 10))cv_file = cv2.FileStorage(“./ arr.xml”), cv2.FileStorage_WRITE)cv_file.write("arr ", arr)cv_file.release()C++中读取xml文件:string path = "./arr.xml";cv::FileStorage cv_file(pa...

1 C++中如何调用python 中numpy数组变量——xml文件

(1)Python中写入xml文件:

arr = np.random.random((10, 10))
cv_file = cv2.FileStorage(./arr.xml”, cv2.FileStorage_WRITE)
cv_file.write("arr ", arr)
cv_file.release()

(2)C++中读取xml文件:

string path = "./arr.xml";
cv::FileStorage cv_file(path, cv::FileStorage::READ);
cv::Mat arr;
cv_file["arr"] >> arr;
cv_file.release();

打开xml文件,type_id前面对应的是变量名,如下arr为变量名

<?xml version="1.0"?>
<opencv_storage>
<arr type_id="opencv-matrix">
  <rows>3</rows>
  <cols>3</cols>
  <dt>d</dt>
  <data>
    8.9535297591993968e-02 6.9886897302531437e-01 4.7054884894646920e-01
    1.8916937579699100e-01 7.9890025562913491e-01 3.6986110618962009e-01
    2.5680837013939484e-01 7.3721407264774441e-01 5.8065059731930979e-01</data></arr>
</opencv_storage>

(3)补充:

Python中读取xml文件:

cv_read_file = cv2.FileStorage("./arr.xml", cv2.FileStorage_READ)
arr_read = cv_read_file.getNode("arr").mat()
cv_read_file.release()
print("arr_read:\n", arr_read)

(4)注意:

  • 用arr = cv2.imread(“,./1.jpg) 替换arr = np.random.random((10, 10))也是可以的;

  • 也就是读取到图片内容和创建的数组都可以保存为xml文件;

  • 其中arr类型为<class ‘NoneType’>,可通过arr = np.array(arr)变成<class ‘numpy.ndarray’>;

2 C++中如何调用python 中list列表——txt文件

(1)Python中list列表写入txt文件:

# 列表写入**txt**,按行写入**

 list = [123, 323, 223, 423, 623, 523]
 filename = open('list.txt', 'w')
 for value in list:
   filename.write(str(value) + "\n")
 filename.close()

(2)C++中读取txt文件,放入vector:

string path = "./list.txt";
ifstream fin(path);  // #include<fstream>
vector list;
string line;
if (fin)
{while (getline(fin, line)) //#include<string> 有opencv就不用加了{
​          cout << line << endl;
​          list.push_back(line);}
}

3 C++中如何调用python 中dict字典——csv文件

(1)python保存dict文件

import csv

# dict相关属性
A = {"A": 1, "B": 2, "C": 3}
key = A.keys()
value = A.values()
item = A.items()  # items()方法把字典中每对key和value组成一个元组,并把这些元组放在列表中返回。
print(item)  # dict_items([('A', 1), ('B', 2), ('C', 3)])
print(key)  # dict_keys(['A', 'B', 'C'])
print(list(key)[0])  # A

# dict写入csv,第一行为key,第二行为value
f_dict = open("./1.csv", "w", newline='')  # newline='',不加该句第二行会空行
writer = csv.DictWriter(f_dict, key)  # list(key)
writer.writeheader()  # 写入表头,key的内容写入表头
writer.writerow(A)
writer.writerow(A)

(2)C++调用csv,实现dict功能(map函数)

#include<iostream>
#include<opencv2/opencv.hpp>
#include<fstream>
using namespace std;
using namespace cv;


vector<string> splitstr(const std::string& str, char tag);


int main()
{
	string path = "F:\\Users\\whd\\Desktop\\AS\\AS_whd\\Predict\\1.csv";
	ifstream f_csv(path);
	vector<vector<string>> dict;
	while (!f_csv.eof())
	{
		string str;
		vector<string> names;
		getline(f_csv, str);
		if (str != "")  //特别注意csv读取时, 会读入csv最后一行空的,加上该句排除
		{
			names = splitstr(str, ',');
			dict.push_back(names);
		}
	}
	
	typedef map<string, string> smap; // map可以写成其他map<string, int>等形式
	smap my_dict;

	// 生成c++字典dict
	for (int j = 0; j < dict[0].size(); j++)
	{
		my_dict[dict[0][j]] = dict[1][j];
	}

	//显示dict内容
	smap::iterator it = my_dict.begin();
	while (it != my_dict.end())
	{
		cout << "my_dict  key:" << it->first << " -> " << "value:" << it->second << endl;
		it++;
	}
	std::cout << "end" << std::endl;


	return 0;
}



/*
作用:
	根据分隔符分割字符串,返回分割后的vector<string>
参数:
	str: 待分割的字符串
	tag: 根据什么字符进行分割
返回值:
	自带返回值,返回值类型为vector<string>,用于存放分割后的字符串;
*/
vector<string> splitstr(const std::string& str, char tag)
{
	vector<string>  li;
	std::string subStr;

	//遍历字符串,同时将i位置的字符放入到子串中,当遇到tag(需要切割的字符时)完成一次切割
	//遍历结束之后即可得到切割后的字符串数组
	for (size_t i = 0; i < str.length(); i++)
	{
		if (tag == str[i]) //完成一次切割
		{
			if (!subStr.empty())
			{
				li.push_back(subStr);
				subStr.clear();
			}
		}
		else //将i位置的字符放入子串
		{
			subStr.push_back(str[i]);
		}
	}

	if (!subStr.empty()) //剩余的子串作为最后的子字符串
	{
		li.push_back(subStr);
	}

	return li;
}

(3)注意:**txt文件也可以,分开保存keys和values到不同的txt文件

补充(1) numpy随机数生成

import numpy as np
np.random.seed(0)
print(np.random.random((3, 4))) # 或者写成**np.random.random((2, 2))**,将中括号改成小括号**
print(np.random.randn(3, 4)) # 正态分布**-1.96~1.96**之间,概率为**0.95**;有正有负,也不排除这个区间外的。**
print(np.random.rand(3, 4)) # 均匀分布,**0~1**之间。**
# 注意: random**和**rand**区别**
#    相同点:两个函数都是在 [0, 1) 的均匀分布中产生随机数。**
#    不同点:参数传递不同。**random.random( )**接收一个单独的元组,而**random.rand( )**接收分开的参数**
print(np.random.randint(5)) # 随机生成一个**0~5**之间的整数**
print(np.random.randint(5, 10)) # 随机生成一个**5~10**之间的整数。**
# 注意:有**high**值,就是**low~high**;无**high**值,就是**0~low

补充(2) C++ opencv Mat

(1)Mat.type()

opencv中Mat存在各种类型,其中mat有一个type()的函数可以返回该Mat的类型。类型表示了矩阵中元素的类型以及矩阵的通道个数,它是一系列的预定义的常量,其命名规则为CV_(位数)+(数据类型)+(通道数)。具体的有以下值:
C++移植python模型及中间参数
通道数我们可以发现,C4=C3+8、C3=C2+8


(2)Mat类矩阵类型

Mat类矩阵类型可以是CV_8UC3、CV_16SC1…CV_64FC3等。里面的8U表示8位无符号整数(0~255),16S表示16位有符号整数(32768-32767),64F表示64位浮点double类型数据,C后面的数表示通道数,例如C1表示一个通道的图像,C3表示3个通道的图像。通道一般只有1、3、4,1个通道表示灰度图(0 - 255),3个通道为RGB图像(0 - 255, 0 - 255, 0 - 255),4个通道为RGBA(其中A代表透明度)。

(3)Mat创建及属性

cv::Mat image = Mat(240, 320, CV_8UC3, Scalar(135, 255, 135));  // 240**行(高),**320**列(宽)
cv::Mat image = Mat(240, 320, CV_8UC1, Scalar(0));   // 240**行(高),**320**列(宽)
cv::imshow("image", image);    //1**通道和**3**通道都能显示
cv::waitKey(100);
cout << image.cols << endl;           // 320
cout << image.rows << endl;           // 240
cout << image.dims << endl;           // 2
cout << image.channels() << endl;     // 3
cout << image.size() << endl;         // [320x240]   //size**属性:**[****x****] 
cout << image.type() << endl;         // 16

C++查看变量类型:

typeid(arr).name()

python查看变量类型:

type(arr)

本文地址:https://blog.csdn.net/weixin_41874898/article/details/111933941