USBカメラを用いてリアルタイムで円を検出する以下のプログラムに、検出した円の半径を求めるプログラムを追加したいです。どうすればよいでしょうか。
該当のソースコード
C++
1#include "stdafx.h" 2#include <stdio.h> 3#include <opencv/cv.h> 4#include <opencv2/highgui/highgui.hpp> 5#include <opencv2/imgcodecs/imgcodecs.hpp> 6#include <opencv2/imgproc/imgproc.hpp> 7#include <opencv2/core/core.hpp> 8 9int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) 10{ 11 12 int i; 13 float *p; 14 double w = 320, h = 240; 15 16 IplImage *src_img = 0, *gray_img = 0; 17 CvMemStorage *storage; 18 CvSeq *circles = 0; 19 CvCapture *capture = 0; 20 21 22 /* カメラの設定 */ 23 capture = cvCreateCameraCapture(0); 24 25 // (2)キャプチャサイズを設定する. 26 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, w); 27 cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, h); 28 29 30 cvNamedWindow("circles", CV_WINDOW_AUTOSIZE); 31 32 33 while (1) { 34 35 36 src_img = cvQueryFrame(capture); 37 38 CvSize sizeOfImage = cvGetSize(src_img); 39 gray_img = cvCreateImage(cvGetSize(src_img), IPL_DEPTH_8U, 1); 40 41 // グレイスケールに変換 42 cvCvtColor(src_img, gray_img, CV_BGR2GRAY); 43 44 45 // (2)ハフ変換のための前処理 46 cvSmooth(gray_img, gray_img, CV_GAUSSIAN, 11, 11, 0, 0); 47 storage = cvCreateMemStorage(0); 48 49 // (3)ハフ変換による円の検出と検出した円の描画 50 51 circles = cvHoughCircles(gray_img, storage, CV_HOUGH_GRADIENT, 52 1, 100, 20, 50, 10, MAX(gray_img->width, gray_img->height)); 53 54 for (i = 0; i < circles->total; i++) { 55 p = (float *)cvGetSeqElem(circles, i); 56 cvCircle(src_img, cvPoint(cvRound(p[0]), cvRound(p[1])), 3, CV_RGB(0, 255, 0), -1, 8, 0); 57 cvCircle(src_img, cvPoint(cvRound(p[0]), cvRound(p[1])), cvRound(p[2]), CV_RGB(255, 0, 0), 3, 8, 0); 58 } 59 60 // (4)検出結果表示用のウィンドウを確保し表示する 61 cvShowImage("circles", src_img); 62 cvWaitKey(10); 63 const int key = cv::waitKey(1); 64 if (key == 'q') 65 { 66 break; 67 } 68 } 69 70 cvDestroyWindow("circles"); 71 cvReleaseImage(&src_img); 72 cvReleaseImage(&gray_img); 73 cvReleaseMemStorage(&storage); 74 75 return 0; 76 77}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。