OpenCV HoughCircles - PullRequest
       5

OpenCV HoughCircles

2 голосов
/ 02 августа 2010

Я использую Xcode и c ++

Я скопировал код HoughCircles из документации OpenCV :

#include <cv.h>
#include <highgui.h>
#include <math.h>

using namespace cv;

int main(int argc, char** argv)
{
    Mat img, gray;
    if( argc != 2 && !(img=imread(argv[1], 1)).data)
        return -1;
    cvtColor(img, gray, CV_BGR2GRAY);
    // smooth it, otherwise a lot of false circles may be detected
    GaussianBlur( gray, gray, Size(9, 9), 2, 2 );
    vector<Vec3f> circles;
    HoughCircles(gray, circles, CV_HOUGH_GRADIENT,
                 2, gray->rows/4, 200, 100 );
    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]);
         // draw the circle center
         circle( img, center, 3, Scalar(0,255,0), -1, 8, 0 );
         // draw the circle outline
         circle( img, center, radius, Scalar(0,0,255), 3, 8, 0 );
    }
    namedWindow( "circles", 1 );
    imshow( "circles", img );
    return 0;
}

, затем изменил его следующим образом:

int main(int argc, char** argv)
{
    VideoCapture cap(0);
    if(!cap.isOpened())
        return -1;
    namedWindow( "circles", 1 );

    Mat img, gray;
    for( ;; )
    {

        cap >> img;
        vector<Vec3f> circles;      
        cvtColor(img, gray, CV_BGR2GRAY);
        GaussianBlur(gray, gray, Size(7,7), 1.5, 1.5);
        HoughCircles(img, circles, CV_HOUGH_GRADIENT, 2, img->rows/4, 200, 100 );
        imshow( "circles", img );
        if(waitKey(30) >= 0) break;
    }

    return 0;
}

Я получаю ошибку в обоих случаях: ошибка: базовый операнд '->' имеет тип без указателя 'cv :: Mat', затем я заменяю -> на.и все равно получаю еще одну ошибку.Это то же самое с кодом, который я скопировал из документации.

Моя теория состоит в том, что это происходит, потому что это не получение и изображение или что-то.но когда я вынимаю код HoughCircles, камера работает нормально.

Любые идеи, пожалуйста ??

Ответы [ 2 ]

2 голосов
/ 28 октября 2010

Во-первых, вы не должны передавать адреса img и circles.HoughCircles принимает ссылки, а не указатели.Если вы попытаетесь передать &img и &circles, вы получите новые и захватывающие ошибки типа.Исходный код в этом отношении корректен.

Если бы функция взяла указатели, ее объявление было бы:

void HoughCircles(Mat * image, vector<Vec3f> * circles, ...);

(что не является -Я упоминаю это только для тех, кто смущен синтаксисом & в объявлениях функций C ++)

Во-вторых, -> не будет работать, потому что Mat является объектом, а не указателем.Я лишь слегка удивлен, что оригинальная документация неверна.Интерфейс OpenCV C ++ (который вы используете, если вы используете cv::Mat) является чем-то новым, и материал все еще находится в процессе перехода.Вероятно, это было скопировано / вставлено из документации по API C, и что -> было пропущено.

img.rows должно работать (и работает для меня).Ошибка, которую вы указали для случая img.rows, не является полной ошибкой, поэтому я не уверен, почему это жалоба.

Единственное, что я сейчас вижу, это то, что параметр dpdouble, а вы передаете int.Любой компилятор C ++, который я когда-либо использовал, сделает для вас это преобразование с повышением частоты, но если ваш компилятор находится в режиме полной паранойи, вы можете попробовать изменить 2 на 2.0.(Я действительно, очень сомневаюсь, что это проблема, но без более подробной информации об ошибке, я не понимаю, почему вы получаете ошибки во время компиляции)

Во время выполнения, однако, он взорветсяпотому что вы передаете HoughCircles ваш первоначальный img на основе BGR, а не один канал gray.

0 голосов
/ 02 августа 2010

Обе ошибки компиляции? Какую ошибку вы получаете, когда используете . для доступа к img членам? Я уверен, что вы не должны использовать -> в этом случае, поскольку img не является указателем на Mat.

Согласно справочному руководству по API (вам нужно взять с собой добычу):

void HoughCircles(Mat& image, vector<Vec3f>& circles, int method, double dp, double minDist, double param1=100, double param2=100, int minRadius=0, int maxRadius=0);

Вы должны передать адрес памяти объектов img и кружков вместо передачи самих объектов.

Вы должны сделать что-то вроде:

HoughCircles(&img, &circles, CV_HOUGH_GRADIENT, 2, img.rows/4, 200, 100 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...