Lesen HSV-Wert des pixels in opencv
wie würden Sie gehen über das Lesen der pixel-Wert im HSV-format anstatt RGB? Der folgende code liest den Pixelwert des Kreise' - Zentren im RGB-format. Ist es viel Unterschied, wenn es um das Lesen Wert im HSV?
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.y, center.x, NULL);
//printf("B: %d G: %d R: %d\n", ptr[0],ptr[1],ptr[2]);
CvScalar s;
s = cvGet2D(img,center.y, center.x);//colour of circle
printf("B: %f G: %f R: %f\n",s.val[0],s.val[1],s.val[2]);
//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;
}
InformationsquelleAutor | 2011-10-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie die C++ - Schnittstelle, die Sie verwenden können,
Sehen die Dokumentation für cvtColor für weitere Informationen.
Update:
Lesen und schreiben von Pixeln, die langsamer unterwegs sind (vorausgesetzt, dass die HSV-Werte sind, werden als
cv::Vec3b
(doc))Mithilfe der
image.at<...>(x, y)
(doc, scrollen Sie nach unten eine Menge) - notation ist ziemlich langsam, wenn Sie wollen, zu manipulieren, um jedes pixel. Es ist ein Artikel in der eine Dokumentation, wie auf die Pixel schneller. Sie können die iterator-Methode auch so:Sie sollten mehr explizit in deine Frage wo dein problem ist. Ich nahm an, dass Sie wusste, wie man den Zugriff auf die Elemente einer
cv::Mat
da Sie zu sein schien in der Lage zu Lesen, die Pixel im RGB-format.ich habe die Codes die ich schrieb zu Lesen der pixel-Wert in RGB. sieht viel anders als das, was Sie vorgeschlagen haben. Jeder Weg, es kann getan werden, ähnlich, wie ich geschrieben habe, es für RGB? Dank
OpenCV nicht aussetzen einer bgr2hsv(CvScalar&) - Funktion. Schreiben Sie selbst einer.
ah stimmt. Dank
InformationsquelleAutor bjoernz