使用 python 将 cv2.calcHist 保存到 CSV 文件中的单个单元格中
Saving a cv2.calcHist into a single cell in a CSV file using python
我正在使用 python 开发一个项目,我需要保存正在检测的人物的属性,例如衣服、衣服颜色和检测直方图。我希望将每个 属性 保存到一个 单个 单元格中,以便每一行代表一个检测。
现在我希望有人能告诉我如何最好地将直方图数组保存到 单个 单元格中。
这可能吗?
您需要确定一种格式,以便可以轻松读回。以下方法首先为 3 行数据创建一些随机直方图数据。它首先写入一个header。接下来,它使用 np.array2string()
函数将每个直方图转换为文本。它使用 ;
分隔符,以免与其他值的标准 ,
混淆。然后它会删除所有不需要的空格和换行符,因此生成的二维数组位于一行上。然后它使用标准 csv.writer()
来写入行。
然后我将展示如何再次读回数据并将其转换回 numpy 数组:
import numpy as np
import csv
import ast
import sys
# Create some data and histograms to save
row = [(0, "Tops", "maroon"), (1, "Socks", "blue"), (2, "Shirts", "white")]
hists = [np.random.randint(0, 20, size=(3, 10), dtype=np.int32) for _ in range(3)]
with open('output.csv', 'w', newline='') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(['index', 'type', 'colour', 'hist'])
for item, hist in zip(row, hists):
hist_text = np.array2string(hist, separator=';', threshold=sys.maxsize).replace(' ','').replace('\n', '')
csv_output.writerow([*item, hist_text])
# To read it back from the CSV into a numpy array
with open('output.csv') as f_input:
csv_input = csv.reader(f_input)
header = next(csv_input)
for index, type, colour, hist_text in csv_input:
print(index, type, colour)
hist = np.array(ast.literal_eval(hist_text.replace(';', ',')), dtype=np.int32)
print(hist)
所以这会给你 output.csv
包含类似的东西:
index,type,colour,hist
0,Tops,maroon,[[12;6;9;10;2;7;10;8;0;4];[16;10;5;16;15;17;7;14;2;4];[18;17;11;10;19;15;1;1;2;8]]
1,Socks,blue,[[15;5;4;7;18;12;9;5;6;14];[11;6;12;1;2;11;11;15;0;12];[9;11;7;2;14;18;8;13;15;17]]
2,Shirts,white,[[11;17;12;9;2;13;19;5;10;14];[16;16;3;8;5;8;6;0;18;15];[5;7;2;4;16;5;11;17;9;19]]
读回时,它会显示:
0 Tops maroon
[[12 6 9 10 2 7 10 8 0 4]
[16 10 5 16 15 17 7 14 2 4]
[18 17 11 10 19 15 1 1 2 8]]
1 Socks blue
[[15 5 4 7 18 12 9 5 6 14]
[11 6 12 1 2 11 11 15 0 12]
[ 9 11 7 2 14 18 8 13 15 17]]
2 Shirts white
[[11 17 12 9 2 13 19 5 10 14]
[16 16 3 8 5 8 6 0 18 15]
[ 5 7 2 4 16 5 11 17 9 19]]
我正在使用 python 开发一个项目,我需要保存正在检测的人物的属性,例如衣服、衣服颜色和检测直方图。我希望将每个 属性 保存到一个 单个 单元格中,以便每一行代表一个检测。
现在我希望有人能告诉我如何最好地将直方图数组保存到 单个 单元格中。 这可能吗?
您需要确定一种格式,以便可以轻松读回。以下方法首先为 3 行数据创建一些随机直方图数据。它首先写入一个header。接下来,它使用 np.array2string()
函数将每个直方图转换为文本。它使用 ;
分隔符,以免与其他值的标准 ,
混淆。然后它会删除所有不需要的空格和换行符,因此生成的二维数组位于一行上。然后它使用标准 csv.writer()
来写入行。
然后我将展示如何再次读回数据并将其转换回 numpy 数组:
import numpy as np
import csv
import ast
import sys
# Create some data and histograms to save
row = [(0, "Tops", "maroon"), (1, "Socks", "blue"), (2, "Shirts", "white")]
hists = [np.random.randint(0, 20, size=(3, 10), dtype=np.int32) for _ in range(3)]
with open('output.csv', 'w', newline='') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(['index', 'type', 'colour', 'hist'])
for item, hist in zip(row, hists):
hist_text = np.array2string(hist, separator=';', threshold=sys.maxsize).replace(' ','').replace('\n', '')
csv_output.writerow([*item, hist_text])
# To read it back from the CSV into a numpy array
with open('output.csv') as f_input:
csv_input = csv.reader(f_input)
header = next(csv_input)
for index, type, colour, hist_text in csv_input:
print(index, type, colour)
hist = np.array(ast.literal_eval(hist_text.replace(';', ',')), dtype=np.int32)
print(hist)
所以这会给你 output.csv
包含类似的东西:
index,type,colour,hist
0,Tops,maroon,[[12;6;9;10;2;7;10;8;0;4];[16;10;5;16;15;17;7;14;2;4];[18;17;11;10;19;15;1;1;2;8]]
1,Socks,blue,[[15;5;4;7;18;12;9;5;6;14];[11;6;12;1;2;11;11;15;0;12];[9;11;7;2;14;18;8;13;15;17]]
2,Shirts,white,[[11;17;12;9;2;13;19;5;10;14];[16;16;3;8;5;8;6;0;18;15];[5;7;2;4;16;5;11;17;9;19]]
读回时,它会显示:
0 Tops maroon
[[12 6 9 10 2 7 10 8 0 4]
[16 10 5 16 15 17 7 14 2 4]
[18 17 11 10 19 15 1 1 2 8]]
1 Socks blue
[[15 5 4 7 18 12 9 5 6 14]
[11 6 12 1 2 11 11 15 0 12]
[ 9 11 7 2 14 18 8 13 15 17]]
2 Shirts white
[[11 17 12 9 2 13 19 5 10 14]
[16 16 3 8 5 8 6 0 18 15]
[ 5 7 2 4 16 5 11 17 9 19]]