使用SQL / MM静止图像将BLOB图像与存储为ORDImage的图像进行比较

时间:2012-03-27 16:35:21

标签: oracle plsql blob oracle11gr2

我正在使用 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;

谢谢!

1 个答案:

答案 0 :(得分:2)

即使这是一个超过一年的问题,我只是在查看自己对另一个问题的答案时才发现它。但只是想知道,为什么你需要按属性比较图像,这很慢。

最佳解决方案是为图像添加哈希varchar字段,然后比较这些哈希值。如果找到相同的散列,则图片已经存在。这可以是md5哈希示例。当然,您需要运行此过程才能已经存储数据库。

使用图像的所有类型的属性来散列它,但不是文件名本身:大小,宽度,高度,着色所有类型。

当用户尝试添加新图像时,它会获取这些图像属性,将它们一起散列,然后将该哈希值与数据库中的其他哈希值进行比较,如果匹配则表示图像已经存在并忽略插入。

超快速版本比较图像而不是“解压缩图像” - 方法。