我尝试使用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类型的算法结果。
我的问题是我如何获得哈希的字符串表示?
答案 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;