2011-10-12 2 views
1

스누커 테이블에서 22 개의 공을 탐지하려고합니다. 나는 테스트 할 이미지가 있지만 프로그램 볼 때 2 개의 볼과 임의의 원을 다른 곳에서 찾는다. 내 코드는 원 감지 알고리즘과 함께 아래에 있습니다. 누구든지 필요한 매개 변수를 얻으려면 어떤 매개 변수를 조정해야하는지 알고 있습니까? 감사합니다CV 동그라미를 감지하는 동그라미 매개 변수

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

int main(int argc, char** argv) 
{ int edge_thresh = 1; 
    IplImage* img = cvLoadImage("C:\\Users\\Nathan\\Desktop\\SnookerPic.png", 1);; 
    IplImage* gray = cvCreateImage(cvGetSize(img), 8, 1); 
    IplImage *edge = cvCreateImage(cvSize(img->width,img->height), 8, 1); 
    CvMemStorage* storage = cvCreateMemStorage(0); 
    cvCvtColor(img, gray, CV_BGR2GRAY); 
    cvThreshold(gray,gray, CV_GAUSSIAN, 9, 9); 
    cvSmooth(gray, gray, CV_GAUSSIAN, 11, 11); 
    cvCanny(gray, edge, (float)edge_thresh, (float)edge_thresh*3, 5); 
    CvSeq* circles = cvHoughCircles(edge, storage, 
     CV_HOUGH_GRADIENT, 2, 20, 200, 50); 
    int i; 

    for (i = 0; i < circles->total; i++) 
    { 
     float* p = (float*)cvGetSeqElem(circles, i); 
     cvCircle(img, cvPoint(cvRound(p[0]),cvRound(p[1])), 
      3, CV_RGB(0,255,0), -1, 8, 0); 
     cvCircle(img, cvPoint(cvRound(p[0]),cvRound(p[1])), 
      cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0); 
    } 
    cvNamedWindow("circles", 1); 
    cvShowImage("circles", img); 


    return 0; 
} 
+0

테스트에서 사용중인 이미지를 공유하면 많은 도움이됩니다. – karlphillip

답변

2

너무 제한적이거나 느슨한 매개 변수로 문제가 있다고 생각합니다. 원하는 서클 수를 얻을 때까지 매개 변수로 재생해야합니다. 또한, 가우스 11x11 블러는 이미지에 따라 다소 공격적 일 수 있습니다. 내 이미지는 좋은 것보다 해를 끼쳤지 만 내 이미지는 이상화 된 이미지입니다 ...

Canny 매개 변수로 재생할 수있는 트랙 바를 포함하기 위해 사용하는 OpenCV 예제를 수정했습니다. 이것은 실제로 어떻게 작동하는지에 대한 느낌을 갖도록 도와줍니다. 또한 minDist 매개 변수에주의하십시오. 내 이미지의 경우 원 중심은 약 32 픽셀 떨어져있었습니다. 이 크기를 서클 크기로 조정해야합니다. 그래서, 여기에 샘플입니다 :

#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 

using namespace cv; 

int hi = 1, lo = 1; 

int main(int argc, char* argv[]) { 
    Mat orig = imread("Snooker_balls_triangled.png"); 
    int key = 0; 

    namedWindow("circles", 1); 
    createTrackbar("hi", "circles", &hi, 255); 
    createTrackbar("lo", "circles", &lo, 255); 

    do 
    { 
     // update display and snooker, so we can play with them 
     Mat display = orig.clone(); 

     Mat snooker; 
     cvtColor(orig, snooker, CV_RGB2GRAY); 

     vector<Vec3f> circles; 

     // also preventing crash with hi, lo threshold here... 
     HoughCircles(snooker, circles, CV_HOUGH_GRADIENT, 2, 32.0, hi > 0 ? hi : 1, lo > 0 ? lo : 1); 
     for(size_t i = 0; i < circles.size(); i++) 
     { 
      Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); 
      int radius = cvRound(circles[i][2]); 

      // draw the green circle center 
      circle(display, center, 3, Scalar(0,255,0), -1, 8, 0); 

      // draw the blue circle outline 
      circle(display, center, radius, Scalar(255,0,0), 3, 8, 0); 
     } 

     imshow("circles", display); 
     imshow("snooker", snooker); 
     key = waitKey(33); 
    } while((char)key != 27); 
    return 0; 
} 

나는이 snooker image을 사용하고, this 내가 얻을 출력됩니다.

(PS 당신이 ios.h을 포함, 또는 단순히 IMG을 처리하기 위해 자신의 클래스 메소드를 작성해야 아이폰 OS를 사용하는 경우는 C 인터페이스 IMHO :

+0

감사합니다. 많은 코드가 내 방식과 다르며 트랙바의 목적이 무엇인지 이해하지 못합니다. 그리고 CvCanny는 어디에서 모두 했습니까? cvThreshold 등으로 이동 하시겠습니까? – user966890

+0

OpenCV 2.3.1의 C++ 인터페이스를 사용하고 있습니다 (OpenCV 2.2보다 새로운 기능은 없다고 생각합니다.) 트랙 바를 사용하면 Canny 임계 값을 조정하여 이미지의 변경 사항을 확인할 수 있습니다. 연습으로 minDist 매개 변수에 다른 트랙 막대를 추가 할 수 있습니다. 마지막으로, HoughCircles는 이미 이미지에서 Canny 작업을 수행하여 서클을 찾습니다. Hi와 Lo 변수가 그 것이다. – mevatron

0

훨씬 우수의 인터페이스 ++은 C를 사용하는 것을 고려 proc cvMat에서 UIImage로, 그 반대의 경우도 마찬가지입니다.

의견을 남겨주세요. 아마도 저와 같은 '횡설수설'연구를 발견했을 가능성이있는 사람들에게만 포함되었습니다. 모든 이미지에는 완전히 다른 설정이 필요합니다. 포기 하지마. houghcircles는 거기서 최고의 탐지 알고리즘에 관한 것입니다. 일부 게임 코드를 검색 기능과 결합하여 더 좋고, 더 간단하고, 빠릅니다.

#import "JmBViewController.h" 

@interface JmBViewController() 

@end 

@implementation JmBViewController 

- (void)viewDidLoad { 
[super viewDidLoad]; 
_imgtest = [UIImage imageNamed:@"IMG_0424.PNG"]; 

cv::Mat cvImage; 
UIImageToMat(_imgtest, cvImage); 
if (!cvImage.empty()) { 
    cv::Mat gray; 
    // cv::Mat filteredMat; 
    cv::cvtColor(cvImage, gray, CV_BGRA2GRAY); 
    // cv::GaussianBlur(gray, gray, cv::Size(5, 5), 1.2, 1.2); 
    cv::vector<cv::Vec3f> circles; 
    //cv::HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 1, 50); 
    /* 
    for(size_t i = 0; i < circles.size(); i++) 
    { 
     cv::Point center((cvRound(circles[i][0]), cvRound(circles[i][1]))); 
     int radius = cvRound(circles[i][2]); 
     cv::circle(gray, center, 3, cv::Scalar(0,255,0)); 
     cv::circle(gray, center, radius, cv::Scalar(0,0,255)); 
    } 
    */ 

// for (int i = 1; i < 15; i = i + 2) 

     cv::GaussianBlur(gray, gray, cv::Size(9, 9), 1.5, 1.5); 

     cv::Mat edges; 
     cv::Canny(gray, edges, 0, 50); 
     //gray.setTo(cv::Scalar::all(0)); 
     //gray.setTo(cv::Scalar::all(255), edges); 
     cv::HoughCircles(gray, circles, CV_HOUGH_GRADIENT, 1, gray.rows/30, 100, 50, 10, 30); 
     for(size_t i = 0; i < circles.size(); i++) 
     { 
      cv::Point center(cvRound(circles[i][0]), cvRound(circles[i][1])); 
      int radius = cvRound(circles[i][2]); 
      cv::circle(cvImage, center, 5, cv::Scalar::all(200), -1, 8, 0);//center 
      cv::circle(cvImage, center, radius, cv::Scalar::all(255), 3, 8, 0);//diamter 
     NSLog(@"Circles: %ld", i+1); 

     // cv::imshow(&"circles i " [ i], gray); 
    } 


    _imgView.image = MatToUIImage(cvImage); 
    } 
    /* 
cv::Mat cvImage; 
cv::Mat grey; 
cv::Mat filteredMat; 
cv::vector<cv::Vec3f> circles; 
// cv::cvtColor(_imgtest, cvImage, CV_BGR2GRAY); 
cv::threshold(grey, filteredMat, 100, 255, CV_THRESH_BINARY); 
[UIImageCVMatConverter cvMatGrayFromUIImage:_imgtest]; 
// cv::cvtColor(cvImage, grey, CV_RGBA2GRAY); 
// UIImageToMat(_imgtest, cvImage); 
cv::HoughCircles(cvImage, circles, CV_HOUGH_GRADIENT, 1, 50); 
// MatToUIImage(cvImage); 
_imgView.image = [UIImageCVMatConverter UIImageFromCVMat:cvImage]; 
_imgView.image = MatToUIImage(cvImage); 
*/ 

// Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 
// Dispose of any resources that can be recreated. 
} 
/* 

UIImage* MatToUIImage(const cv::Mat& image) { 
NSData *data = [NSData dataWithBytes:image.data length:image.elemSize()*image.total()]; 
CGColorSpaceRef colorSpace; 
if (image.elemSize() == 1) { 
    colorSpace = CGColorSpaceCreateDeviceGray(); 
}else { colorSpace = CGColorSpaceCreateDeviceRGB(); 
} 
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data); 

CGImageRef imageRef = CGImageCreate(image.cols, image.rows, 8, 8*image.elemSize(), image.step.p[0], colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault, provider, NULL, FALSE, kCGRenderingIntentDefault); 
UIImage *finalImage = [UIImage imageWithCGImage:imageRef]; 

return finalImage; 
} 
*/ 


@end