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;
}
}
@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
Đó là cách duy nhất tôi có thể nghĩ đến. – karlphillip
@ 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