Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

So sánh hình ảnh BLOB với hình ảnh được lưu trữ dưới dạng ORDImage bằng Hình ảnh tĩnh SQL / MM

Cuối cùng tôi đã quay lại vấn đề và bắt nó hoạt động.

Vấn đề chỉ đơn giản là tôi có một số null các giá trị trong Hình ảnh ORDIO lĩnh vực ...

Tôi đã tìm thấy lỗi của mình khi cố gắng lưu trữ Hình ảnh tĩnh đối tượng trực tiếp vào ẢNH của tôi bảng:

alter table PHOTOS add phot_source2 SI_Stillimage;
update photos p set p.phot_source2 = si_stillimage(p.phot_source.source.localData) where p.phot_id < 10;

và sau đó triển khai ví dụ tối thiểu sau :

DECLARE
    l_img_obj   si_stillimage;
    l_avgcolor  si_averagecolor;
    l_colorhist si_colorhistogram;
    l_poscolor  si_positionalcolor;
    l_texture   si_texture;
    l_featurelist   si_featurelist;
    l_blob      BLOB;
    l_exist     INTEGER;
BEGIN
    -- get the blob from the ordimage
    SELECT p.phot_source.source.localdata
    INTO l_blob FROM photos p
    WHERE phot_id = 2;
    -- build the stillimage object from the blob
    l_img_obj := NEW si_stillimage(l_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 is found in the table
    SELECT 1
    INTO l_exist
    FROM photos p
    WHERE si_scorebyftrlist(l_featurelist, p.phot_source2) = 0
    AND phot_id < 10
    AND rownum = 1;
    -- show message if at least one similar photo has been found
    IF (l_exist = 1) THEN       
        dbms_output.put_line('A similar photo has been found');
    END IF;
END;
/ 

Nó hoạt động tốt khi hạn chế phot_id thành 10, thậm chí bằng cách thay thế p.phot_source2 với si_mkstillimage1(p.phot_source.source.localdata) (mà đã gây ra sự cố). Nhưng không thành công khi xóa phot_id sự hạn chế. Vì vậy, cuối cùng tôi đã hiểu rằng tôi có một số null các giá trị trong phot_source cột ( ORDImage ) có thể gây ra sự cố.

Và thực sự đang gọi SI_StillImage() hàm tạo có null tham số dẫn đến thông báo lỗi sau:

ORA-06510: PL/SQL: unhandled user-defined exception
ORA-06512: at "ORDSYS.SI_STILLIMAGE", line 27
ORA-06512: at "ORDSYS.SI_MKSTILLIMAGE1", line 6
ORA-06512: at line 24

Tôi đã xóa tất cả null các giá trị từ phot_source và tất cả hiện đang hoạt động tốt :)

Để đi xa hơn:

Nhược điểm của điều này là mất nhiều thời gian để thực hiện so sánh với tất cả các hình ảnh được lưu trữ trong bảng ( 1155 giây (khoảng thời gian 20 phút) với giá 5000 ảnh). Vì vậy, tôi đã cố gắng lưu trữ các tính năng hình ảnh trực tiếp vào bảng:

alter table photos add (
    phot_averagecolor si_averagecolor,
    phot_colorhistogram si_colorhistogram,
    phot_positionalcolor si_positionalcolor,
    phot_texture si_texture
)

update photos p set
    p.phot_averagecolor = si_averagecolor(si_stillimage(p.phot_source.source.localData)),
    p.phot_colorhistogram = si_colorhistogram(si_stillimage(p.phot_source.source.localData)),
    p.phot_positionalcolor = si_positionalcolor(si_stillimage(p.phot_source.source.localData)),
    p.phot_texture = si_texture(si_stillimage(p.phot_source.source.localData))
where p.phot_id < 10

Và sau đó thực hiện so sánh như sau:

-- get the blob from the ordimage
SELECT p.phot_source.source.localdata
INTO l_blob FROM photos p
WHERE phot_id = 2;
-- build the stillimage object from the blob
l_img_obj := NEW si_stillimage(l_blob);
-- get image features and build the featureList object
l_avgcolor    := si_averagecolor(l_img_obj);
l_colorhist   := si_colorhistogram(l_img_obj);
l_poscolor    := si_positionalcolor(l_img_obj);
l_texture     := 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 is found in the table
SELECT 1
INTO l_exist
FROM photos p
WHERE p.phot_averagecolor = l_avgcolor
AND p.phot_colorhistogram = l_colorhist
AND p.phot_positionalcolor = l_poscolor
AND p.phot_texture = l_texture
AND p.phot_id < 10
AND rownum = 1;

Nhưng nó đưa ra lỗi sau vì có vẻ như không thể so sánh các tính năng hình ảnh trực tiếp bằng cách sử dụng = nhà điều hành:

ORA-22901: cannot compare VARRAY or LOB attributes of an object type
ORA-06512: at line 24

Tôi nghĩ rằng một giải pháp sẽ là lưu trữ các tính năng hình ảnh dưới dạng giá trị số, nhưng tôi đã đọc toàn bộ tài liệu và tôi không tìm thấy bất kỳ cách nào để nhận bất kỳ giá trị số tương ứng nào từ một đối tượng địa lý hình ảnh.

May mắn thay, SI_score các chức năng được cung cấp cho từng tính năng hình ảnh, vì vậy chúng tôi có thể sử dụng các chức năng sau để so sánh các hình ảnh:

DECLARE
    l_img_obj   si_stillimage;
    l_blob      BLOB;
    l_exist     INTEGER;
BEGIN
    -- get the blob from the ordimage
    SELECT p.phot_source.source.localdata
    INTO l_blob FROM photos p
    WHERE phot_id = 2;
    -- build the stillimage object from the blob
    l_img_obj := NEW si_stillimage(l_blob);
    -- check if a similar image is found in the table
    SELECT 1
    INTO l_exist
    FROM photos p
    WHERE p.phot_averagecolor.SI_Score(l_img_obj) = 0
    AND p.phot_colorhistogram.SI_Score(l_img_obj) = 0
    AND p.phot_positionalcolor.SI_Score(l_img_obj) = 0
    AND p.phot_texture.SI_Score(l_img_obj) = 0
    AND rownum = 1;
    -- show message
    dbms_output.put_line(l_count || ' similar photo(s) found');
END;
/

Tôi đã giảm thời gian từ 1155 giây (khoảng 20 phút) đến 226 giây (dưới 3 phút) với giá 5000 hình ảnh.

Tôi biết, nó vẫn còn rất chậm, nhưng tôi không thể tìm ra cách khác để cải thiện màn trình diễn ..., nếu ai có ý tưởng đừng ngần ngại chia sẻ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trích xuất một dấu thời gian đầy đủ (bao gồm cả ngày tháng) từ một truy vấn Chọn; Oracle

  2. Groovy / Grails không thể tải oracle.jdbc.driver.OracleDriver

  3. Làm cách nào để tạo chỉ mục văn bản cho tìm kiếm '% abc%'?

  4. Hai hàng được chèn như thế nào?

  5. Định cấu hình các điều kiện tiên quyết của gói UTL_MAIL