Ошибка выхода OpenCV из диапазона

#opencv #range

#opencv #диапазон

Вопрос:

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

 #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: %dn", ptr[0],ptr[1],ptr[2]);
         //CvScalar c;
         //if(center.x > 0 amp;amp; center.x < 1280 amp;amp; center.y > 0 amp;amp; 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: %dn",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;
}
  

введите описание изображения здесь

Комментарии:

1. Не могли бы вы опубликовать соответствующий раздел кода?

Ответ №1:

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

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

Должно быть:

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

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

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

Комментарии:

1. большое вам спасибо. теперь все работает. спасибо, что посмотрели это. я бы не заметил, так как обычно сначала я бы определил координаты x

2. Да, это сбивало с толку. На самом деле это не ваша вина. На самом деле не хватает документации. Но, вероятно, вам следует рассмотреть возможность использования интерфейса C в будущем, поскольку он лучше документирован и имеет больше возможностей.