【发布时间】:2022-01-21 06:27:03
【问题描述】:
我们正在设计一种算法,该算法可以从感知哈希列表中构建 Merkle 树。我们从视频中捕获的每一帧都会生成哈希值。这背后的动机是,即使视频格式发生了变化,我们也能够识别哈希值。
为了验证这一点,我们有两个图像:Video.mp4 和 Video.avi。我们以 30 fps 的速度提取帧,并对这些图像运行 pHash。为了测试我们的功能,每个实例(来自 .mp4 和来自 .avi)的图像都必须保持不变。但是,这两个图像仍然存在一些差异。
包含代码供参考:
- 从视频中提取帧:
def extract_frames(file_path, write_to_path, fps=30):
cap = cv2.VideoCapture(file_path)
count = 0
os.mkdir(f'{write_to_path}/frames')
while cap.isOpened():
ret, frame = cap.read()
if ret:
grayed_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imwrite(f"{write_to_path}/frames/frame{count}.bmp", grayed_image)
count += fps # i.e. at 30 fps, this advances one second
cap.set(1, count)
else:
cap.release()
break
print(f"Frame Extraction complete. Extracted {count // fps} frames.")
return count
- 测试两张图片是否相似
def check_images(path_1, path_2):
img_1 = cv2.imread(path_1, 0)
img_2 = cv2.imread(path_2, 0)
if img_1.shape == img_2.shape:
difference = cv2.subtract(img_1, img_2)
print(difference)
result = not np.any(difference)
return result
print("Unequal shapes, ", img_1.shape, img_2.shape)
return False
- 感知散列函数
def generate_p_hashes(count, frame_path, fps=30):
count_two = 0
hashes = []
# fileToWrite = open('/content/hash.txt', 'a')
while count_two != count:
temp_hash = imagehash.phash(Image.open(f"{frame_path}/frames/frame{count_two}.bmp"))
count_two += fps
str_temp_hash = str(temp_hash)
hashes.append(str_temp_hash)
print(f"PHash generation complete. Generated {count_two // fps} hashes")
return hashes
Imagehash 是一个 Python 包,位于:https://github.com/JohannesBuchner/imagehash
- 图片:
这是我尝试过的:
- 将图像转换为灰度,从而排除颜色通道。
- 尝试所有不同的图像格式(JPEG、压缩为 0 的 PNG、TIFF、BMP)
样本输出:
存储这些图像的最佳方法是什么,这样无论我从哪个视频源中提取,图像都将保持不变?
【问题讨论】:
-
我不明白这背后的前提。您是否假设您会从两个具有不同压缩和格式的视频中获得像素完美的相同帧,在这些视频中您反复尝试将视频长度降低 30 帧?
-
“最好的存储方式,使它们在不同格式中都相同”:这没有任何意义。以某种格式存储不会影响其他文件!
-
感知哈希上的默克尔树,这个想法需要理论上的证明。您在这里使用相似性/不同性,而不是完全相等。无论您使用什么操作来组合默克尔树中的哈希,都必须维护差异/相似性度量。 -- 在您证明这一点之前,首先证明您对不同编码视频(mp4 和 avi 是 容器,而不是编解码器)的感知散列仍然显示出一些相似性。 - 您没有显示任何计算感知散列的代码。你认为这与问题无关吗?
-
给
cap.set的神奇数字是什么?有为此命名的常量。 - 此外,寻找视频文件......很少是准确的。不要指望那个。不要寻求。只需按顺序阅读。 -
@ChristophRackwitz,我已经添加了相关的代码。由于实现依赖于第三方库,我没想过早点放。
标签: python opencv image-processing