Tôi cố gắng tìm centroid bằng cách sử dụng cv của OpenCV C++ :: Moments. Bất kỳ đối số nào tôi gửi cho nó, Tất cả những gì tôi nhận được đều là số không. Rõ ràng tôi làm điều gì đó rất đơn giản là sai. Đầu ra của mã:OpenCV C++ sử dụng cv :: Moments
23 of 500 elements in unit 3
point values 2.976444 18.248287
matrix size 23
moments 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
moments 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
Và mã:
printf("%d of %d elements in unit %d\n",k,number_of_features,i);
cv::Mat x(k, 1, cv::DataType<cv::Point2f>::type);
k=0;
for(int j=0;j <number_of_features;j++) {
if(i == labels.at<int>(j)) {
x.at<cv::Point2f>(k++) = samples.at<cv::Point2f>(i);
}
}
printf("point values %f %f\n", x.at<cv::Point2f>(0).x,x.at<cv::Point2f>(0).y);
cv::Size s=x.size();
printf("matrix size %d\n",s.height);
cv::Moments m=cv::moments(x);
printf("moments %f %f %f %f %f %f %f %f\n",m.m00,m.m01,m.m20,m.m11,m.m02,m.m30,m.m21,m.m03);
double h[7];
cv::HuMoments(m,h);
printf("moments %f %f %f %f %f %f %f\n",h[0],h[1],h[2],h[3],h[4],h[5],h[6]);
Kỳ lạ thay tôi không thể tìm thấy bất kỳ mẫu mã giống hệt nhau từ Google. Tất cả những gì tôi thấy là cách tiếp cận kiểu C.
Cảm ơn! Trước tiên, tôi xác nhận phương thức của bạn hoạt động và thứ hai tôi đã tìm thấy lỗi của mình vì làm việc với mã của bạn. Tôi đã sử dụng "i" thay vì "j": x.at (k ++) = samples.at (j/* BUG WAS HERE * /); –