【发布时间】:2012-07-14 04:59:48
【问题描述】:
我今天大部分时间都在尝试找到某种函数来为已知图像生成密钥,以便稍后进行比较以确定图像是什么。我尝试使用 SIFT 和 SURF 描述符,它们都太慢(并且已获得商业用途专利)。我最近的尝试是使用以下方法创建 dct 哈希:
int mm_dct_imagehash(const char* file, float sigma, uint64_t *hash){
if (!file) return -1;
if (!hash) return -2;
*hash = 0;
IplImage *img = cvLoadImage(file, CV_LOAD_IMAGE_GRAYSCALE);
if (!img) return -3;
cvSmooth(img, img, CV_GAUSSIAN, 7, 7, sigma, sigma);
IplImage *img_resized = cvCreateImage(cvSize(32,32), img->depth, img->nChannels);
if (!img_resized) return -4;
cvResize(img, img_resized, CV_INTER_CUBIC);
IplImage *img_prime = cvCreateImage(cvSize(32,32), IPL_DEPTH_32F, img->nChannels);
if (!img_prime) return -5;
cvConvertScale(img_resized, img_prime,1, 0);
IplImage *dct_img = cvCreateImage(cvSize(32,32), IPL_DEPTH_32F, img->nChannels);
if (!dct_img) return -6;
cvDCT(img_prime, dct_img, CV_DXT_FORWARD);
cvSetImageROI(dct_img, cvRect(1,1,8,8));
double minval, maxval;
cvMinMaxLoc(dct_img, &minval, &maxval, NULL, NULL, NULL);
double medval = (maxval + minval)/2;
int i,j;
for (i=1;i<=8;i++){
const float *row = (const float*)(dct_img->imageData + i*dct_img->widthStep);
for (j=1;j<=8;j++){
if (row[j] > medval){
(*hash) |= 1;
}
(*hash) <<= 1;
}
}
cvReleaseImage(&img);
cvReleaseImage(&img_resized);
cvReleaseImage(&img_prime);
cvReleaseImage(&dct_img);
return 0;
}
这确实产生了我正在寻找的类型,但是当我尝试将其与已知哈希的数据库进行比较时,我得到的误报与正数一样多。所以,我又回来了,我想我可能会问专家。
你们中的任何人都知道/有一个功能,可以为我提供的图像提供某种标识符/校验和,这将在相似的图像中保持相似,因此它可以用于通过与数据库的比较来快速识别图像?简而言之,图像与哪类校验和最匹配?
我不是在寻找理论、概念、论文或想法,而是寻找切实可行的解决方案。我不会再花一天时间在死胡同里挖掘,感谢任何花时间整理一些代码的人。
通过更多研究,我知道 autoit 开发人员设计的像素校验和使用“Adler-32”算法。我想下一步是找到一个 c 实现并让它处理像素数据。欢迎提出任何建议!
【问题讨论】:
-
你应该看看这个stackoverflow.com/questions/9986766/… 现在不要把我当成混蛋,但你应该从一开始就知道这种应用程序不是免费提供的有一些研究人员提出了一些概念,还有一些公司,比如谷歌,能够根据这些理论制造出商业产品。您绝对可以尝试一些东西 - SIFT/SURF/AGAST/FREAK 检测器是最好的,但您必须以月或年为单位计算项目时间,而不是几天。
-
不要被关于该主题的大量网络参考所迷惑——其中大多数是为 SIFT 发布了 OpenCV 示例的小变体的学生。从那里到商业应用还有很长的路要走。
-
感谢您花时间考虑您的答案,但您的问题过于复杂了。这不是在视频流(例如网络摄像头)中检测对象的复杂过程。我说的是小屏幕截图,例如仅“添加评论”按钮中的文本,然后生成校验和。离适用阶段不远了,autoit用户已经用了一段时间了,见:autoitscript.com/forum/topic/48333-find-pixelchecksum
-
我在这里看看是否有可以在 OSX 上实现的替代方案。
标签: objective-c macos image-processing opencv image-recognition