2010-08-02 2 views
2

Im используя Xcode и C++OpenCV HoughCircles

Я скопировал код HoughCircles из OpenCV documentation:

#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; 
} 

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

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

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

ответ

0

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

Согласно API reference manual (вы должны взять бабло на него):

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); 
+0

да обе ошибки. ошибка, которую я получаю при использовании. : «cv :: HoughCircles (cv :: Mat const &, __gnu_debug_def :: vector , std :: allocator >> &, int, double, double, double, double, int, int) », на который ссылаются: – Harry

+0

Я отредактировал свой ответ, чтобы предоставить вам лучшую информацию. – karlphillip

2

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

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

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

(Что это не так - я только упоминаю это для кого-то еще, что смущает синтаксис & в Си ++ декларации)

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

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

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

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

Смежные вопросы