2014-12-16 16 views
6

Tôi đang sử dụng GPUImageHoughTransformLineDetector để cố gắng phát hiện các văn bản đánh dấu trong hình:Sử dụng GPUImage và GPUImageHoughTransformLineDetector để phát hiện văn bản được đánh dấu ranh giới hộp

enter image description here

Tôi đang sử dụng đoạn mã sau để thử và phát hiện màu xanh bounding dòng hộp:

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:rawImage]; 
GPUImageHoughTransformLineDetector *lineFilter = [[GPUImageHoughTransformLineDetector alloc] init]; 
[stillImageSource addTarget:lineFilter]; 
GPUImageLineGenerator *lineDrawFilter = [[GPUImageLineGenerator alloc] init]; 
[lineDrawFilter forceProcessingAtSize:rawImage.size]; 

__weak typeof(self) weakSelf = self; 
[lineFilter setLinesDetectedBlock:^(GLfloat *flt, NSUInteger count, CMTime time) { 
    NSLog(@"Number of lines: %ld", (unsigned long)count); 
    GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; 
    [blendFilter forceProcessingAtSize:rawImage.size]; 
    [stillImageSource addTarget:blendFilter]; 
    [lineDrawFilter addTarget:blendFilter]; 

    [blendFilter useNextFrameForImageCapture]; 
    [lineDrawFilter renderLinesFromArray:flt count:count frameTime:time]; 
    weakSelf.doneProcessingImage([blendFilter imageFromCurrentFramebuffer]); 
}]; 
[stillImageSource processImage]; 

Mỗi lần tôi chạy này không phụ thuộc vào edgeThreshold hoặc 1023 dòng và kết quả đầu ra trông giống như:

enter image description here

Không rõ lý do tại sao thay đổi ngưỡng không làm bất cứ điều gì, nhưng tôi chắc chắn tôi hiểu nhầm điều gì đó. Bất cứ ai có bất cứ ý tưởng về cách tốt nhất làm điều này?

Trả lời

6

Tôi vừa thực hiện một số cải tiến đối với bộ dò đường biến đổi Hough trong khung làm việc với điều này, nhưng bạn sẽ cần thực hiện thêm một số tiền xử lý trước cho hình ảnh của bạn để chọn ra hộp màu xanh đó.

Hãy để tôi giải thích cách hoạt động của hoạt động này. Đầu tiên, nó phát hiện các cạnh trong một hình ảnh. Đối với mỗi pixel được xác định là một cạnh (ngay bây giờ, tôi đang sử dụng một máy dò cạnh Canny cho điều này), tọa độ của điểm ảnh đó được trích xuất. Mỗi tọa độ đó sau đó được sử dụng để vẽ một cặp đường thẳng trong không gian tọa độ song song (dựa trên quy trình được mô tả trong "Real-Time Detection of Lines using Parallel Coordinates and OpenGL" bởi Dubská, et al.).

Điểm ảnh trong không gian tọa độ song song nơi các đường giao cắt sẽ tăng cường độ. Các điểm cường độ lớn nhất trong không gian tọa độ song song cho biết sự hiện diện của một đường cảnh thế giới thực.

Tuy nhiên, chỉ các pixel là cực đại cục bộ cho cường độ mới chỉ ra dòng thực. Thách thức là xác định cực đại địa phương để ngăn chặn tiếng ồn từ những cảnh bận rộn. Đó là những gì tôi đã không hoàn toàn giải quyết trong hoạt động này. Trong hình ảnh của bạn ở trên, số lượng lớn các dòng là do một mớ hỗn độn của các điểm nằm trên ngưỡng phát hiện trong không gian tọa độ song song, nhưng không được loại bỏ đúng cách vì không phải là cực đại cục bộ.

tôi đã thực hiện một số cải tiến, tuy nhiên, vì vậy tôi đang nhận được một lượng bụi từ hoạt động bây giờ (tôi chỉ làm điều này một cách nhanh chóng tắt một cấp dữ liệu video trực tiếp màn hình của tôi):

enter image description here

Tôi cố định một lỗi trong bộ lọc ngăn chặn không tối đa cục bộ và mở rộng vùng mà nó hoạt động trên từ 3x3 đến 5x5. Nó vẫn còn để lại đằng sau một loạt các điểm không tối đa gây ra tiếng ồn, nhưng nó tốt hơn nhiều.

Bạn sẽ nhận thấy điều này vẫn không thực hiện được những gì bạn muốn. Nó chọn lên dòng trong văn bản, nhưng không phải hộp của bạn. Đó là bởi vì văn bản màu đen trên nền trắng tạo ra các cạnh rất sắc nét, rất sắc nét ở giai đoạn phát hiện cạnh, nhưng hộp chọn màu xanh nhạt trên nền trắng cần một ngưỡng cực kỳ thấp để được nhặt trong bất kỳ quá trình phát hiện cạnh nào.

Nếu bạn luôn chọn một hộp chọn màu xanh, tôi khuyên bạn nên chạy một thao tác tiền xử lý để xác định duy nhất các đối tượng màu xanh trong cảnh. Một cách đơn giản để làm điều này là xác định bộ lọc tùy chỉnh trừ thành phần màu đỏ từ màu xanh cho mỗi pixel, sàn giá trị âm và lấy kết quả của phép tính đó làm đầu ra cho các kênh đỏ, lục và lam. Bạn thậm chí có thể muốn nhân kết quả bằng 2.0-3.0 để tăng cường sự khác biệt này.

Kết quả của việc đó phải là hình ảnh nơi các khu vực màu xanh lam trong hình ảnh của bạn hiển thị dưới dạng màu trắng và ở mọi nơi khác với màu đen. Điều đó sẽ cải thiện đáng kể độ tương phản xung quanh hộp lựa chọn của bạn và làm cho việc chọn ra từ văn bản trở nên dễ dàng hơn. Bạn sẽ cần phải thử nghiệm với các thông số phù hợp để có được điều này là đáng tin cậy như bạn muốn trong trường hợp của bạn.

+0

Ok điều này cực kỳ hữu ích. Sử dụng ý tưởng của bạn về một tiền lọc và sau đó lọc nó thông qua các phát hiện cạnh bản thân mình với một bán kính mờ 5px Tôi có thể có được hình ảnh này mà cảm thấy SO CLOSE: https://dl.dropboxusercontent.com/spa/zsb1h2lxmgrll8w/zz-6b7tc .png (có 12 dòng trong hình ảnh này). Tôi biết LineFilter đã đặt nó thông qua một phát hiện cạnh nhưng tôi muốn làm một trước chỉ để chắc chắn. Tôi không chắc làm thế nào nó có thể không phát hiện các đường ngang trong bức ảnh đó. My lineDetectionThreshold là 0,3 trong ảnh đó. (Tôi đang sử dụng chủ) –

+0

@IanOwnbey - Có thể có một lỗi trong một heuristic tôi sử dụng để lọc ra một số giá trị tiếng ồn. Hãy xem trong phương thức -extractLineParametersFromImageAtFrameTime: của GPUImageHoughTransformLineDetector.m nơi tôi có các bình luận "Test for the case". Logic của tôi có thể thiếu sót ở đó. Xem nếu loại bỏ những điều kiện đó (chỉ sử dụng các trường hợp khác) làm cho điều này tốt hơn. Nếu vậy, tôi có thể loại bỏ điều đó. –

+0

Ok cảm ơn tuyệt vời, một điểm đúng hướng là tất cả tôi cần hy vọng :) –

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