2012-02-03 32 views
10

OpenCV nói cái gì đó nhưLàm thế nào tôi có thể bắt các ảnh JPEG bị hỏng khi tải ảnh có imread() trong OpenCV?

Corrupt JPEG data: premature end of data segment 

hoặc

Corrupt JPEG data: bad Huffman code 

hoặc

Corrupt JPEG data: 22 extraneous bytes before marker 0xd9 

khi tải một hình ảnh jpeg tham nhũng với imread(). Tôi có thể hiểu điều đó bằng cách nào đó không? Tại sao tôi lại nhận được thông tin này? Tôi có phải tự kiểm tra tệp nhị phân không?

+0

Xin chào, bạn có giải pháp cho vấn đề này không, tôi cũng chống lại vấn đề này với OpenCV. Cảm ơn bạn! –

+0

người dùng cũng có thể quan tâm đến việc đọc [bài đăng tại đây] (https://stackoverflow.com/questions/24805500/can-i-fix-photos-with-corrupt-jpeg-data) – jdhao

Trả lời

1

Bạn không thể xem nếu bạn sử dụng imread(). Tuy nhiên, có chức năng imdecode() được gọi là imread(). Có thể nó mang lại cho bạn nhiều phản hồi hơn. Đối với điều này, bạn sẽ phải tải hình ảnh vào bộ nhớ của riêng bạn và sau đó gọi bộ giải mã.

Bài viết tóm tắt: Bạn phải tìm hiểu các nguồn OpenCV để giải quyết vấn đề của mình.

+1

yeah .. Tôi đã sợ ai đó sẽ cho tôi biết điều này;) – Ben

+0

Bạn đã bao giờ tìm cách để làm điều này, tôi sẽ rất quan tâm vì tôi đang đối mặt với cùng một vấn đề. – joon

+1

imdecode() không đưa ra bất kỳ phản hồi nào về cảnh báo libjpeg – Aubin

1

tôi đã phải đối phó với điều này thời gian gần đây và tìm ra giải pháp trên đây

http://artax.karlin.mff.cuni.cz/~isa_j1am/other/opencv/

tôi chỉ cần phải thực hiện 2 chỉnh sửa @ $ cv \ modules \ highgui \ src \ grfmt_jpeg.cpp.

--- opencv-1.0.0.orig/otherlibs/highgui/grfmt_jpeg.cpp 2006-10-16 13:02:49.000000000 +0200 
+++ opencv-1.0.0/otherlibs/highgui/grfmt_jpeg.cpp 2007-08-11 09:10:28.000000000 +0200 
@@ -181,7 +181,7 @@ 
      m_height = cinfo->image_height; 
      m_iscolor = cinfo->num_components > 1; 

-   result = true; 
+   result = (cinfo->err->num_warnings == 0); 
     } 
    } 

@@ -405,8 +405,9 @@ 
         icvCvt_CMYK2Gray_8u_C4C1R(buffer[0], 0, data, 0, cvSize(m_width,1)); 
       } 
      } 
-   result = true; 
+ 
      jpeg_finish_decompress(cinfo); 
+   result = (cinfo->err->num_warnings == 0); 
     } 
    } 
4

OpenCV (phiên bản 2.4) không ghi đè lên xử lý lỗi cơ bản cho libjpeg, khiến chúng không thể xử lý được '. Thêm phương pháp sau đây để modules/highgui/src/grfmt_jpeg.cpp, ngay bên dưới các định nghĩa của error_exit():

METHODDEF(void) 
output_message(j_common_ptr cinfo) 
{ 
    char buffer[JMSG_LENGTH_MAX]; 

    /* Create the message */ 
    (*cinfo->err->format_message) (cinfo, buffer); 

    /* Default OpenCV error handling instead of print */ 
    CV_Error(CV_StsError, buffer); 
} 

Bây giờ áp dụng phương pháp này để xử lý lỗi giải mã:

state->cinfo.err = jpeg_std_error(&state->jerr.pub); 
state->jerr.pub.error_exit = error_exit; 
state->jerr.pub.output_message = output_message; /* Add this line */ 

Áp dụng các phương pháp để xử lý lỗi encoder cũng như:

cinfo.err = jpeg_std_error(&jerr.pub); 
jerr.pub.error_exit = error_exit; 
jerr.pub.output_message = output_message; /* Add this line */ 

Biên dịch lại và cài đặt OpenCV như bình thường. Từ bây giờ bạn sẽ có thể bắt lỗi libjpeg giống như bất kỳ lỗi OpenCV nào khác. Ví dụ:

>>> cv2.imread("/var/opencv/bad_image.jpg") 
OpenCV Error: Unspecified error (Corrupt JPEG data: 1137 extraneous bytes before marker 0xc4) in output_message, file /var/opencv/opencv-2.4.9/modules/highgui/src/grfmt_jpeg.cpp, line 180 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
cv2.error: /var/opencv/opencv-2.4.9/modules/highgui/src/grfmt_jpeg.cpp:180: error: (-2) Corrupt JPEG data: 1137 extraneous bytes before marker 0xc4 in function output_message 

(Tôi đã submitted a pull request cho ở trên nhưng nó đã bị từ chối vì nó sẽ gây ra vấn đề với những người đọc hình ảnh không có ngoại lệ đánh bắt.)

Hy vọng điều này sẽ giúp mọi người vẫn phải vật lộn với vấn đề này. Chúc may mắn.

0

Bạn có thể chuyển hướng tiêu bản vào một tệp, sau đó sau khi đọc, tìm chuỗi "Huffman" bên trong tệp đó. Sau khi tìm kiếm tệp, hãy xóa nó. Nó hoạt động cho tôi và bây giờ tôi có thể loại bỏ những hình ảnh bị hỏng và chỉ xử lý những hình ảnh tốt.

0

Tôi thấy rằng vấn đề nằm trong libjpeg.Nếu OpenCV sử dụng nó, nó được lỗi

dữ liệu tham nhũng JPEG: 22 byte không liên quan trước khi đánh dấu 0xd9

Bạn có thể thử my solution để giải quyết nó. Nó vô hiệu hóa JPEG trong quá trình biên dịch. Sau đó OpenCV không thể đọc/ghi, nhưng nó hoạt động.

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_SHARED_LIBS=OFF -D BUILD_EXAMPLES=OFF -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D WITH_JPEG=OFF -D WITH_IPP=OFF .. 
+0

Bạn nên đăng giải pháp của mình ở đây, không chỉ người dùng đến địa điểm khác. Các liên kết được sử dụng để cung cấp thêm thông tin. – jdhao

1

Có thể dễ dàng khắc phục lỗi trong tệp thay vì cố gắng sửa chữa chức năng tải của OpenCV. Nếu bạn đang sử dụng Linux, bạn có thể sử dụng ImageMagick để đền bù cho một tập hợp các hình ảnh (là bình thường để có nó được cài đặt theo mặc định):

$ mogrify -set comment 'Image rewritten with ImageMagick' *.jpg

Lệnh này thay đổi thuộc tính của tập tin để lại dữ liệu hình ảnh hoang sơ . Tuy nhiên, hình ảnh được tải và được lưu lại, loại bỏ các thông tin bổ sung gây ra lỗi tham nhũng.

Nếu bạn cần biết thêm thông tin về ImageMagick bạn có thể ghé thăm trang web của họ: http://www.imagemagick.org/script/index.php

+0

Mặc dù rất khó để bắt lỗi, ít nhất chúng ta cũng có thể loại bỏ thông báo lỗi theo cách này. Đó là giải pháp tốt ~ – jdhao

0

Tôi đang sử dụng gói python opencv để đọc một số hình ảnh và cũng đã gặp thông báo lỗi này. Lỗi này không thể được bắt bởi Python. Nhưng nếu bạn muốn tìm hình ảnh nào bị hỏng mà không biên dịch lại opencv như @Robbert đề xuất, bạn có thể thử phương thức sau.

Trước tiên, bạn có thể xác định thư mục chứa hình ảnh bị hỏng, điều này khá dễ dàng. Sau đó, bạn vào thư mục và sử dụng công cụ dòng lệnh mogrify được cung cấp bởi ImageMagick để thay đổi thông tin meta hình ảnh, như đề xuất bởi @goe.

mogrify -set comment "errors fixed in meta info" -format png *.jpg 

Lệnh trên sẽ chuyển đổi hình ảnh jpg gốc sang định dạng png và cũng xóa hình ảnh gốc để xóa lỗi trong thông tin meta. Khi bạn chạy lệnh mogrify, nó cũng sẽ xuất ra một số thông báo về hình ảnh nào bị hỏng trong thư mục để bạn có thể tìm thấy hình ảnh bị hỏng một cách chính xác.

Sau đó, bạn có thể làm bất cứ điều gì bạn muốn với hình ảnh jpg bị hỏng ban đầu.

Các vấn đề liên quan