我正在使用 Oracle 11g r2 。
我有一个表将图像存储为 ORDImage :
PHOTOS (phot_id integer
, phot_filename varchar2(256)
, phot_source ordsys.ordimage)
另一个临时表,用于将用户上传的图像存储为 BLOB 。
INSERT_TEMP (itemp_id integer, itemp_source blob)
我想通过比较两个图像,只有在尚未存在的情况下才将BLOB图像移动到PHOTOS表中。我需要使用 SQL / MM Still Image 方法,因为Oracle 11g中不推荐使用ORDImageSignature方法。
以下是代码:
declare
[...]
begin
[...]
-- get the blob from the temporary table (in_id passed as parameter)
select itemp_source into l_img_blob from insert_temp where itemp_id = in_id;
-- build the stillimage object from the blob
l_img_obj := new si_stillimage(l_img_blob);
-- get image features and build the featureList object
l_avgcolor := new si_averagecolor(l_img_obj);
l_colorhist := new si_colorhistogram(l_img_obj);
l_poscolor := new si_positionalcolor(l_img_obj);
l_texture := new si_texture(l_img_obj);
l_featurelist := new SI_FeatureList(l_avgcolor, 1, l_colorhist, 1, l_poscolor, 1, l_texture, 1);
-- check if a similar image already exists
select count(*) into l_exist from photos p where SI_ScoreByFtrList(l_featurelist, SI_MkStillImage1(p.phot_source.source.localdata)) = 0;
if (l_exist > 0) then
out_message := app_util.get_translated_message('ERR_SIMILAR_PHOTO_ALREADY_EXISTS');
else
/* here the blob is inserted into the PHOTOS table as ORDImage successfully */
out_message := app_util.get_translated_message('SUC_PHOTO_INSERTED');
end if;
end;
如果省略比较,图像将成功插入ORDImage,否则引发异常( sqlcode:1,sqlerrm:用户定义的异常),使用DBMS_UTILITY.FORMAT_ERROR_BACKTRACE它告诉我以下内容:
ORA-06512:à“ORDSYS.SI_STILLIMAGE”,ligne 27
ORA-06512:à“ORDSYS.SI_MKSTILLIMAGE1”,ligne 6
ORA-06512:à“SURV.APP_CORE”,ligne 212
第212行是检查相似图像是否已存在的行:
select count(*) into l_exist
from photos p
where SI_ScoreByFtrList(l_featurelist, SI_MkStillImage1(p.phot_source.source.localdata)) = 0;
似乎问题在于它不接受p.phot_source.source.localdata
作为参数。您对我如何解决这个问题有任何想法吗?
我也尝试过:
select count(*) into l_exist
from photos p
where l_featurelist.si_score(new si_stillimage1(p.phot_source.source.localdata)) = 0;
谢谢!
答案 0 :(得分:2)
即使这是一个超过一年的问题,我只是在查看自己对另一个问题的答案时才发现它。但只是想知道,为什么你需要按属性比较图像,这很慢。
最佳解决方案是为图像添加哈希varchar字段,然后比较这些哈希值。如果找到相同的散列,则图片已经存在。这可以是md5哈希示例。当然,您需要运行此过程才能已经存储数据库。
使用图像的所有类型的属性来散列它,但不是文件名本身:大小,宽度,高度,着色所有类型。
当用户尝试添加新图像时,它会获取这些图像属性,将它们一起散列,然后将该哈希值与数据库中的其他哈希值进行比较,如果匹配则表示图像已经存在并忽略插入。
超快速版本比较图像而不是“解压缩图像” - 方法。