我已经通过网络搜索,但到目前为止还没有找到以下问题的任何答案,因此我想在这里询问是否有人可以帮助我解决这个问题:
基本上我需要的与 PraveenofPersia/Jesse 那里的解决方案相同,但只有考虑到 Fisherface 识别器的 python 实现: 人脸验证置信度得分的任何提示(与人脸识别相反)?
到目前为止,我面临的问题是 cv2 既不提供 subspaceProject 也不提供任何其他服务。
有人建议吗?
谢谢你!
我已经通过网络搜索,但到目前为止还没有找到以下问题的任何答案,因此我想在这里询问是否有人可以帮助我解决这个问题:
基本上我需要的与 PraveenofPersia/Jesse 那里的解决方案相同,但只有考虑到 Fisherface 识别器的 python 实现: 人脸验证置信度得分的任何提示(与人脸识别相反)?
到目前为止,我面临的问题是 cv2 既不提供 subspaceProject 也不提供任何其他服务。
有人建议吗?
谢谢你!
我继续将 C++ 中的函数重写为 python。这不是最干净的,但它有效!如果您使用此 Python 代码并将其与另一个 C++ 示例中的高级概念相结合,您就可以完全按照您的要求进行操作。
# projects samples into the LDA subspace
def subspace_project(eigenvectors_column, mean, source):
source_rows = len(source)
source_cols = len(source[0])
if len(eigenvectors_column) != source_cols * source_rows:
raise Exception("wrong shape")
flattened_source = []
for row in source:
flattened_source += [float(num) for num in row]
flattened_source = np.asarray(flattened_source)
delta_from_mean = cv2.subtract(flattened_source, mean)
# flatten the matrix then convert to 1 row by many columns
delta_from_mean = np.asarray([np.hstack(delta_from_mean)])
empty_mat = np.array(eigenvectors_column, copy=True) # this is required for the function call but unused
result = cv2.gemm(delta_from_mean, eigenvectors_column, 1.0, empty_mat, 0.0)
return result
# reconstructs projections from the LDA subspace
def subspace_reconstruct(eigenvectors_column, mean, projection, image_width, image_height):
if len(eigenvectors_column[0]) != len(projection[0]):
raise Exception("wrong shape")
empty_mat = np.array(eigenvectors_column, copy=True) # this is required for the function call but unused
# GEMM_2_T transposes the eigenvector
result = cv2.gemm(projection, eigenvectors_column, 1.0, empty_mat, 0.0, flags=cv2.GEMM_2_T)
flattened_array = result[0]
flattened_image = np.hstack(cv2.add(flattened_array, mean))
flattened_image = np.asarray([np.uint8(num) for num in flattened_image])
all_rows = []
for row_index in xrange(image_height):
row = flattened_image[row_index * image_width: (row_index + 1) * image_width]
all_rows.append(row)
image_matrix = np.asarray(all_rows)
image = normalize_hist(image_matrix)
return image
def normalize_hist(face):
face_as_mat = np.asarray(face)
equalized_face = cv2.equalizeHist(face_as_mat)
equalized_face = cv.fromarray(equalized_face)
return equalized_face
不幸的是,这些函数默认情况下不会暴露给 python api。
如果您从源代码构建 cv2.pyd,有一个简单的补救措施:
CV_EXPORTS Mat subspaceProject(...)
为 CV_EXPORTS_W Mat subspaceProject(...)
更改CV_EXPORTS Mat subspaceReconstruct(...)
为 CV_EXPORTS_W Mat subspaceReconstruct(...)
重新运行 cmake / make 以重建 cv 库和 python 包装器模块
额外的 _W 前缀会将这些函数添加到生成的包装器中