Ошибка OpenCv вне диапазона - PullRequest
1 голос
/ 22 октября 2011

Я обнаруживаю круги, как на картинке. я пытаюсь прочитать значение пикселей центров этих кругов, чтобы получить их цвет. Я использую cvPtr2D(img, center.x, center.y, NULL);, чтобы прочитать значение каждого круга в цикле for, но я получаю сообщение об ошибке «значение одного из аргументов выходит за пределы диапазона (индекс находится вне диапазона) в неизвестной функции, строка 179 (которая строка cvPtr2D (). Я не понимаю, как эти значения выходят за пределы допустимого. Кто-нибудь может помочь? Или выложите мой код

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

int main(int argc, char** argv)
{
    //load image from directory
    IplImage* img = cvLoadImage("C:\\Users\\Nathan\\Desktop\\SnookerPic.png");


    IplImage* gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
    CvMemStorage* storage = cvCreateMemStorage(0);

    //covert to grayscale
    cvCvtColor(img, gray, CV_BGR2GRAY);

    // This is done so as to prevent a lot of false circles from being detected
    cvSmooth(gray, gray, CV_GAUSSIAN, 7, 7);

    IplImage* canny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
    IplImage* rgbcanny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
    cvCanny(gray, canny, 50, 100, 3);

    //detect circles
    CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT, 1, 35.0, 75, 60,0,0);
    cvCvtColor(canny, rgbcanny, CV_GRAY2BGR);

    //draw all detected circles
    for (int i = 0; i < circles->total; i++)
    {
         // round the floats to an int
         float* p = (float*)cvGetSeqElem(circles, i);
         cv::Point center(cvRound(p[0]), cvRound(p[1]));
         int radius = cvRound(p[2]);
         uchar* ptr;
         ptr = cvPtr2D(img, center.x, center.y, NULL);
         printf("B: %d G: %d R: %d\n", ptr[0],ptr[1],ptr[2]);
         //CvScalar c;
         //if(center.x > 0 && center.x < 1280 && center.y > 0 && center.y < 720)
         //{
         //c = cvGet2D(img,center.x, center.y);//colour of circle
         //}

         // draw the circle center
         cvCircle(img, center, 3, CV_RGB(0,255,0), -1, 8, 0 );

         // draw the circle outline
         cvCircle(img, center, radius+1, CV_RGB(0,0,255), 2, 8, 0 );

         //display coordinates
         printf("x: %d y: %d r: %d\n",center.x,center.y, radius);
    }

    //create window
    cvNamedWindow("circles", 1);
    cvNamedWindow("SnookerImage", 1);
    //show image in window
    cvShowImage("circles", rgbcanny);
    cvShowImage("SnookerImage", img);

    cvSaveImage("out.png", img);
    //cvDestroyWindow("SnookerImage");
    //cvDestroyWindow("circles");
    //cvReleaseMemStorage("storage");
    cvWaitKey(0);

    return 0;
}

enter image description here

1 Ответ

1 голос
/ 22 октября 2011

Вы проблема в том, что строка:

ptr = cvPtr2D(img, center.x, center.y, NULL);

Должно быть:

ptr = cvPtr2D(img, center.y, center.x, NULL);

К сожалению, документация по этому вопросу не очень ясна. Интуиция подсказала мне, что это именно то, что происходит, но мне нужно было получить исходный код OpenCV, чтобы увидеть, как он использовался для подтверждения этого.

Ваш пример, похоже, работает сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...