2012-05-14 48 views
5

Tôi đã đặt câu hỏi trước đây Marking an interest point in an image using c++. Tôi đã sử dụng cùng một giải pháp và có điểm yêu cầu sử dụng ngưỡng thích ứng và Blob Detection Algorithm (Khu vực đang phát triển). Tôi có con số nguồn gốc nơi tôi muốn để phát hiện các khu vực hình chữ nhật ở trung tâmPhát hiện vùng sáng hình chữ nhật trong Hình ảnh bằng cách sử dụng OpenCv

Hình ảnh Gốc:

Original Image .Nhưng sau khi tôi sử dụng các thuật toán, tôi có một cái gì đó như thế này (chi tiết có thể nhìn thấy nếu bạn mở nó trong một tab mới)

đánh dấu hình ảnh:

enter image description here nơi ngoài khu vực hình chữ nhật những đốm sáng ngày tươi sáng được chiếu sáng cũng có thể nhìn thấy. Tôi đã sử dụng lọc song phương nhưng vẫn không thể phát hiện vùng hình chữ nhật. Nhưng thuật toán này hoạt động cho hình ảnh ban đêm nơi nền tối hơn như mong đợi.

Ai đó có thể gợi ý cho tôi dù các thuật toán tương tự với một số sửa đổi là đủ hoặc bất kỳ cách hiệu quả khác có sẵn ..

Cảm ơn

Trả lời

4

Sử dụng một sự kết hợp đơn giản của mờ & ngưỡng tôi quản lý để có được kết quả này (thay đổi kích cỡ cho các mục đích xem):

Sau đó, áp dụng xói mòn & the squares.cpp technique (đó là một mẫu từ OpenCV) kết quả đầu ra:

gần như là kết quả bạn đang tìm kiếm: phần dưới cùng của hình chữ nhật được phát hiện thành công. Tất cả những gì bạn cần làm là tăng chiều cao của hình chữ nhật được phát hiện (hình vuông màu đỏ) để phù hợp với khu vực bạn quan tâm.

Code:

Mat img = imread(argv[1]); 

    // Blur 
Mat new_img = img.clone(); 
medianBlur(new_img, new_img, 5); 

// Perform threshold 
double thres = 210; 
double color = 255; 
threshold(new_img, new_img, thres, color, CV_THRESH_BINARY); 
imwrite("thres.png", new_img); 

// Execute erosion to improve the detection 
int erosion_size = 4; 
Mat element = getStructuringElement(MORPH_CROSS, 
            Size(2 * erosion_size + 1, 2 * erosion_size + 1), 
            Point(erosion_size, erosion_size)); 
erode(new_img, new_img, element); 
imwrite("erode.png", new_img); 

vector<vector<Point> > squares; 
find_squares(new_img, squares); 
std::cout << "squares: " << squares.size() << std::endl; 

draw_squares(img, squares); 

imwrite("area.png", img); 

EDIT:

Chức năng find_squares() trả về một vector với tất cả các ô vuông được tìm thấy trong các hình ảnh.Bởi vì nó lặp trên tất cả các kênh của hình ảnh, trên ví dụ của bạn nó phát hiện thành công khu vực hình chữ nhật trong mỗi người trong số họ, do đó, in squares.size() kết quả đầu ra 3.

Là một vuông có thể được xem như vectơ 4 (X, Y) tọa độ, OpenCV thể hiện khái niệm này là vector<Point> cho phép bạn truy cập phần X và Y.

Bây giờ, in ấn squares revelead rằng điểm được phát hiện trong một hướng ngược chiều kim đồng:

1st ------ 4th 
|   | 
|   | 
|   | 
2nd ------ 3rd 

Tiếp theo ví dụ này, nó khá rõ ràng rằng nếu bạn cần phải tăng chiều cao của hình chữ nhật bạn cần phải thay đổi Y của 1 và điểm 4:

for (int i = 0; i < squares.size(); i++) 
{ 
    for (int j = 0; j < squares[i].size(); j++) 
    { 
    // std::cout << "# " << i << " " << squares[i][j].x << ","<< squares[i][j].y << std::endl; 
     if (j == 0 || j == 3) 
      squares[i][j].y = 0; 
    } 
} 

+0

@Karlphilip wow..Thats Great..Thanks rất nhiều cho hel của bạn p.Tôi đang nhận được kết quả mong muốn cho các hình ảnh tối hơn nhưng với ngưỡng mã hóa cứng nói (khoảng 80). Nếu nó biến mất khỏi vùng. Tôi không thể tìm thấy các ô vuông. Vì vậy, tôi đã sử dụng giá trị bẻ cong Otsu nhưng tôi phải thêm 30 cho phát hiện thỏa đáng. Bất kỳ cách nào khác để phát hiện cả hình ảnh tối hơn và sáng hơn – ShivShambo

+0

Đó là cách duy nhất tôi có thể nghĩ đến. – karlphillip

+0

@ Karlphilip..Sử dụng thuật toán này Tôi chỉ muốn tìm tọa độ của trung tâm của khu vực hình chữ nhật trong hình gốc. bất kỳ ý tưởng nào mà tôi có thể tiếp cận. – ShivShambo

1

Trong hình ảnh hiển thị ở trên, tôi sẽ đề nghị

  1. hoạt động bình thường sẽ hoạt động tốt hoặc

  2. một chuỗi-line-wise "calculati trên "hoặc

  3. tìm các gradient trong biểu đồ của bạn.

Sẽ có nhiều giải pháp khác. Tôi sẽ xem xét trừ bóng nền nếu điều này nhất quán.

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