#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 в будущем, поскольку он лучше документирован и имеет больше возможностей.