2012-03-22 68 views
5

Tôi có một tập hợp các điểm ảnh loại (tọa độ) openCV Point2f. Tôi muốn tìm 4 người hàng xóm gần nhất của mỗi điểm trong bộ đó. Có chức năng tích hợp cụ thể nào trong openCV để làm điều này hay tôi nên đo khoảng cách giữa mỗi điểm và quyết định bốn điểm gần nhất?Tìm hàng xóm gần nhất - OpenCV

Trả lời

1

Bạn có thể sử dụng bộ phân loại lân cận k gần nhất CvKNearest. Sau khi bạn đã đào tạo trình phân loại với tất cả các điểm của mình, bạn có thể nhận được k hàng xóm gần nhất với chức năng gọi số CvKNearest::find_nearest.

2

This hướng dẫn có thể hữu ích.

Nó cung cấp một ví dụ về đào tạo (như xa như tôi biết cách sử dụng trình KNearest constructor hoặc train() phương pháp; kiểm tra documentation) và nhận ra mục (bằng cách sử dụng, như @sietschie nêu find_nearest() phương pháp).

find_nearest() mất một giá trị int k đại diện cho số tiền cần thiết của các nước láng giềng trên đó phân loại được dựa, nhãn k hàng xóm có thể được trả lại tùy chọn thông qua các tham số neighborResponses, như lấy từ find_nearest() tài liệu liên quan trước đó:

neighborResponses - Giá trị đầu ra tùy chọn cho các hàng xóm tương ứng .

nơi, một lần nữa như một phần của tài liệu, neighbors là:

xóm - con trỏ đầu ra tùy chọn để người hàng xóm vector mình.

Tôi không có kinh nghiệm với những thông số, tuy nhiên cung cấp tôi đã hiểu một cách chính xác, xóm cung cấp giá trị thực tế những người hàng xóm, trong khi neighborResponses cung cấp nhãn của họ.

+1

URL được yêu cầu/2010/10/k-gần nhất-láng giềng-in-opencv/không được tìm thấy trên máy chủ này. –

+1

Cảm ơn @ JürgenK .; blog dường như đã được tân trang - tôi đã cập nhật url. –

+0

tôi nhận được một thời gian chờ theo yêu cầu của các tài liệu hướng dẫn –

8

Mã sau sẽ giúp tìm những người hàng xóm gần nhất của một điểm đã chọn trong số các điểm.

vector<Point2f> pointsForSearch; //Insert all 2D points to this vector 
flann::KDTreeIndexParams indexParams; 
flann::Index kdtree(Mat(pointsForSearch).reshape(1), indexParams); 
vector<float> query; 
query.push_back(pnt.x); //Insert the 2D point we need to find neighbours to the query 
query.push_back(pnt.y); //Insert the 2D point we need to find neighbours to the query 
vector<int> indices; 
vector<float> dists; 
kdtree.radiusSearch(query, indices, dists, range, numOfPoints); 

chỉ mục cho các chỉ mục của hàng xóm và khoảng cách được chọn cung cấp khoảng cách cho những người hàng xóm được chọn.

1

Dưới đây là ví dụ nhỏ thế nào để tìm được 3 điểm gần nhất với (370.464):

#include "opencv2/flann/miniflann.hpp" 

flann::KDTreeIndexParams indexParams; 
flann::Index kdtree(Mat(cloud2d).reshape(1), indexParams); 
vector<float> query; 
query.push_back(370); 
query.push_back(464); 
vector<int> indices; 
vector<float> dists; 
kdtree.knnSearch(query, indices, dists, 3); 
// cloud2d[indices[0]] -- is your first point now 
// cloud2d[indices[1]] and cloud2d[indices[2]] -- is your 2nd and 3rd point 

Xin lưu ý chức năng mà ứng xử điên nếu một số điểm có NAN tọa độ, điều này có thể là trường hợp nếu bạn chia cho 0.0 một nơi nào đó trước đây.

+0

Làm thế nào để bạn thiết lập cloud2d. Tôi có tiêu chuẩn :: vector raaj

+0

thử vector

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