如何从opencv image_hash模块获取哈希值PHashImpl

时间:2018-02-09 22:36:19

标签: c# opencv computer-vision emgucv

我尝试使用OpenCv库中的phash算法实现计算图像的感知哈希值。

由于我使用C#完成任务,因此使用Emgu wrapper for OpenCv

计算是prety forward:

var sourceImage = CvInvoke.Imread("some path to an image", ImreadModes.Color);
var hashAlgorithm = new PHash()
IOutputArray hash = new Mat();
hashAlgorithm.Compute(sourceImage, hash);

//hash is of type IOutpurArry how i can get the string version of the hash

因此,compute方法将哈希变量分配给IOutputArray类型的算法结果。

我的问题是我如何获得哈希的字符串表示?

1 个答案:

答案 0 :(得分:0)

从Mat对象获取字符串表示的方法是创建一个自己的函数。

例如,它可以是来自Mat的所有值的串联。那些像素的强度将是byte 0-255型。 为了获得相同大小的字符串,我们可以将它们转换为十六进制值。

var alg = new PHash();
var hashResult = new Mat();
//Compute the hash
alg.Compute(/*some image as Mat*/, hashResult);

// Get the data from the unmanage memeory
var data = new byte[hashResult.Width * hashResult.Height];
Marshal.Copy(hashResult.DataPointer, data, 0, hashResult.Width * hashResult.Height);

// Concatenate the Hex values representation
var hashHex = BitConverter.ToString(data).Replace("-", string.Empty);

// hashHex has the hex values concatenation as string;