2015-06-20 4 views
3

Как я могу получить точные точки центра с помощью преобразования OpenCV Hough Circle? Мне нужно больше десятичных знаков точной по координатам x, y.Как я могу получить точную точку центра?

(по точным я имею в виду что-то вроде этого) я получил эти координаты центра с MATLAB

x107,775526315904 y112,963480232638 
x469,550463441518 y208,309866770404 
x217,386414755458 y490,882895036058 

Вот мой код:

#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/core/core.hpp> 
#include <iostream> 
#include <stdio.h> 

using namespace cv; 
using namespace std; 


int main() 
{ 
    Mat src, src_gray, src0; 
    printf("Give the name of the picture\n"); 
    char ImageName[20]; 
    scanf("%s", &ImageName); 
    /// Read the image 
    src = imread(ImageName, 1); 
    if (!src.data) 
    { 
     printf("no image data\n"); 
     return main(); 
    } 
    // src0 = src; 
    // imshow("orignal", src0); 
    /// Convert it to gray 
    cvtColor(src, src_gray, CV_BGR2GRAY); 
    GaussianBlur(src_gray, src_gray, Size(9, 9), 2, 2); 
    vector<Vec3f> circles; 
    /// Apply the Hough Transform to find the circles 
    HoughCircles(src_gray, circles, CV_HOUGH_GRADIENT, 0.92, src_gray.rows/10, 20, 10, 55, 60); 
    for (size_t i = 0; i < circles.size(); i++) 
    { 
     Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); 
     int radius = cvRound(circles[i][2]); 
    // printf("%d center x %d y %d\n", i, cvRound(circles[i][0]), cvRound(circles[i][1])); 
    // printf("rad: %d\n", cvRound(circles[i][2])); 
     cout << i + 1 << " centerpoint " << " x: " << circles[i][0] << " y: " << circles[i][1] << "rad: " << circles[i][2] << endl; 
     // cout << i + 1 << " othermethod" << "x : " << center.x << endl; 
     // circle center 
     circle(src, center, 1, Scalar(0, 255, 0), -1, 8, 0); 
     // circle outline 
     circle(src, center, radius, Scalar(255, 0, 0), 1, 8, 0); 
    } 
    imshow("circlefinder", src); 
    waitKey(1); 
    system("PAUSE"); 
    cvDestroyWindow("orignal"); 
    cvDestroyWindow("circlefinder"); 
    printf("new picture ?(y/n)"); 
    char ans[1]; 
    scanf("%s", &ans); 
    if (strcmp(ans, "y")) 
    { 
     return 0; 
    } 
    else if (strcmp(ans, "n")) 
    { 
     return main(); 
    } 

} 

Здесь выход:

Give the name of the picture 
as2.jpg 
145.5test x 
1 centerpoint x: 105.5 y: 112.5rad: 55.5563 
2 centerpoint x: 235.5 y: 427.5rad: 56.626 
3 centerpoint x: 466.5 y: 196.5rad: 55.5203 
A folytatáshoz nyomjon meg egy billentyűt . . . 
new picture ? 
+0

Определить _ «точный» _ больше [на ваш вопрос] (http://stackoverflow.com/posts/30958751/edit) пожалуйста! –

+0

Вы, кажется, занимаетесь делением 'int/int', что приводит к (обязательно усеченному) целому числу. Попробуйте ввести аргументы в 'float' или' double' (независимо от того, что использует библиотека) * до * деления. – o11c

+0

Я не вижу, где я делаю int/int divison. im печать только вектор окружности из преобразования hough –

ответ

1

Это не ваши данные, что потеряно. Это просто функция печати, которую вы сделали, пропуская некоторые цифры.

Try станд :: setprecision:

std::cout << 432.123456789f << " " << std::setprecision(10) << 432.123456789f << std::endl; 

Не забывайте:

#include <iomanip> 

Во всяком случае я не думаю, что вам действительно нужно, что Precission. Ошибка измерения в обработке изображений обычно довольно велика, и последние цифры не дают вам никакой реальной информации.

+0

на самом деле, так как я написал, мне нужно всего лишь 3-4 числа после десятичной точки, но ваш метод не решает проблему. я пытался точность 10, но только радиан имел 10 чисел после десятичной точки, а координаты x y были одинаковыми .... и они всегда заканчиваются до 5, если вы посмотрите на мой результат –