Python 2.7 使用Python和openCV访问Spark中的图像

Python 2.7 使用Python和openCV访问Spark中的图像,python-2.7,opencv,apache-spark,Python 2.7,Opencv,Apache Spark,我在下面找到了使用Python将图像读入ApacheSpark的链接 [ 下面是我调用descripe()函数的代码片段。descripe()函数实际计算这些图像的直方图,并将其转换为特征向量并存储在.csv文件中,稍后我将使用该文件与单个图像进行比较,以获得相似性分数 for imagePath in glob.glob(args["dataset"] + "/*.*"): # extract the image ID (i.e. the unique filename) from t

我在下面找到了使用Python将图像读入ApacheSpark的链接

[

下面是我调用descripe()函数的代码片段。descripe()函数实际计算这些图像的直方图,并将其转换为特征向量并存储在.csv文件中,稍后我将使用该文件与单个图像进行比较,以获得相似性分数

for imagePath in glob.glob(args["dataset"] + "/*.*"):
    # extract the image ID (i.e. the unique filename) from the image
    # path and load the image itself
    imageID = imagePath[imagePath.rfind("/") + 1:]
    image = cv2.imread(imagePath)

    # describe the image
    features = cd.describe(image)

    # write the features to file
    features = [str(f) for f in features]
    output.write("%s,%s\n" % (imageID, ",".join(features)))
这里我唯一关心的是,在使用sc.binaryfiles(/path/images)读取图像后,如何调用上述cd.decribe函数,使其能够并行计算索引

抱歉,如果我在这方面听起来很幼稚,但我是第一次使用Python和OpenCv

编辑:我对这些序列化概念有点陌生。让我试着简化这个问题

我正在运行以下spark代码:

导入库

import cv2
import numpy as np
import matplotlib.pyplot as plt
import glob
import os
import time
阅读图片

image = cv2.imread(master_folder + "/query_shelf.png")
从映像创建RDD

image2 = sc.parallelize(image)
计算直方图

hist = cv2.calcHist([image2], [0], None, [256], [0, 256])
这是一个错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: images is not a numpy array, neither a scalar
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:图像不是numpy数组,也不是标量

上面的calHist()函数在image上运行良好,因为它已经是一个numpy数组,但在image2上无法执行,而image2不是。我想在Spark中实现并行性的唯一方法是(如果可以的话)是在RDD上运行映射程序,而不是在Python本地数组上运行…请建议

我实际上在您建议的@zero323线程中问了这个问题,但我再次被要求重新打开一个新问题。我现在根据您的建议编辑了这个问题。谢谢,我不确定我是否理解。您是否可以问
sc.binaryFiles(…).map(readFile).map(cd.descripe)
?如果结果是可序列化的或没有移动,应该可以。根据我的说法,图像处理是使用并行性的最佳用例之一,因为每个图像彼此独立。函数cd.descripe(图像)计算给定目录中图像的功能。如果我可以跨HDFS stirage系统的节点放置图像,我可以用Python编写代码,在每个节点上生成并行映射程序并调用cd.descripe(图像)并行运行并计算特征向量。稍后我们可以有一个减缩器,它可以组合结果并将结果存储在单个文件中。我只能猜测
cd.description
正在做什么,但长话短说,如果你可以作为一个关联运算符重新编写,它使用或多或少的常量内存并生成可序列化的结果,那么你就可以唱它来减少操作是一种选择。我已经把我的问题缩小到一段代码,并编辑了上面的问题。请看..谢谢