2011-11-17 12 views
3

나는 진행중인 당구 게임 이미지를 가져 와서 다양한 볼의 위치를 ​​감지하는 안드로이드 앱을 만들고 있습니다. 이미지는 다른 사람의 전화에서 가져온 것이므로 테이블의 완벽한 오버 헤드 뷰는 없습니다. 지금 나는 공을 찾기 위해 houghcircles를 사용하고 있습니다. 괜찮은 일을하고 있지만, 여기저기서 약간의 공을 놓친 것처럼 보이고 오탐이 있습니다.OpenCV로 당구 공 감지하기

내 가장 큰 문제는 바로 테이블 밖에서 발견되는 오 탐지를 줄이는 방법입니다. ROI를 사용하여 이미지의 윗부분을 잘라내는데 대부분 공간이 낭비되기 때문에 작게 만들 수는 없으며 사다리꼴이기 때문에 테이블의 일부를 잘라낼 위험이 있습니다. 나의 현재 아이디어는 사용자가 이미지 위에 그림을 찍을 때 보는 가이드를 오버레이하는 것이지만, 그 문제는 카메라의 해상도가 무엇인지 모르기 때문에 오버레이가 포함될 수 있다는 것입니다. 잘못된 지점을 찾아라. 이상적으로 나는 houghlines를 사용하고 싶을 것이라고 생각하지만, 시도했을 때 내 앱이 추억의 부족이라고 생각한 것에서 추락했다. 어떤 아이디어? 여기

내가지고있어 결과에 대한 링크입니다 : 여기

http://graphiquest.com/cvhoughcircles.html

내 코드입니다 :

IplImage img = cvLoadImage("/sdcard/DCIM/test/picture"+i+".jpg",1); 
    IplImage gray = opencv_core.cvCreateImage(opencv_core.cvSize(img.width(), img.height()), opencv_core.IPL_DEPTH_8U, 1); 

    cvCvtColor(img, gray, opencv_imgproc.CV_RGB2GRAY); 
    cvSetImageROI(gray, cvRect(0, (int)(img.height()*.15), (int)img.width(), (int)(img.height()-(img.height()*.20)))); 


    cvSmooth(gray,gray,opencv_imgproc.CV_GAUSSIAN,9,9,2,2); 

    Pointer circles = CvMemStorage.create();   
    CvSeq seq = cvHoughCircles(gray, circles, CV_HOUGH_GRADIENT, 2.5d, (double)gray.height()/30, 70d, 100d, 0, 80); 

    for(int j=0; j<seq.total(); j++){ 
     CvPoint3D32f point = new CvPoint3D32f(cvGetSeqElem(seq, j)); 

     float xyr[] = {point.x(),point.y(),point.z()}; 
     CvPoint center = new CvPoint(Math.round(xyr[0]), Math.round(xyr[1])); 

     int radius = Math.round(xyr[2]); 
     cvCircle(gray, center, 3, CvScalar.GREEN, -1, 8, 0); 
     cvCircle(gray, center, radius, CvScalar.BLUE, 3, 8, 0); 
    } 
    String path = "/sdcard/DCIM/test/"; 
    File photo=new File(path, "picture"+i+"_2.jpg"); 

    if (photo.exists()) 
    { 
     photo.delete(); 
    } 
    cvSaveImage("/sdcard/DCIM/test/picture"+i+"_2.jpg", gray); 
+1

헤이 vince88. 이 프로젝트를 완료 한 적이 있습니까? 소스 코드를 오픈 소스로 사용 했습니까? 나는 지금 막 비슷한 것을 시작하려고했다. – m1ket

답변

4

당신이 적용 할 수있는 매우 유용한 제약이 있습니다. 직사각형 관심 영역을 수행하는 것 외에도 풀 테이블의 실제 사다리꼴 모양으로 결과를 마스크해야합니다. 풀 테이블 영역을 찾으려면 이미지의 색상 정보를 사용하십시오. 당구대가 단색임을 알고 있습니다. 녹색 일 필요는 없습니다. HSV 색상 공간에서 일부 histogram 기술을 사용하여 이미지에서 가장 널리 퍼진 색상을 찾고 아마도 중심을 향한 픽셀을 선호 할 수 있습니다. 풀 테이블의 색상을 감지 할 가능성이 큽니다. 이 색상과 일치하는 픽셀을 선택하고, 노이즈를 제거하기 위해 형태학 연산을 수행 한 다음 마스크를 등고선으로 처리하고 convexHull을 찾습니다. 풀 볼에 의해 생성 된 구멍을 제거하기 위해 선체를 채우십시오.

지금까지 말한 내용은 Hough 서클과 다른 접근 방식을 제안해야합니다. 당구 공이 고르게 조명되지 않기 때문에 허블 원이 너무 잘 작동하지 않습니다. 따라서 당구 공을 찾는 또 다른 방법은 당구 테이블 색상 마스크를 convexHull에서 빼는 것입니다. 볼에 의해 가려진 테이블 영역이 남아있게됩니다.

+0

의견을 보내 주셔서 감사합니다. 저는 OpenCV와 이미지 프로세싱에 대해 처음 보았습니다. 그래서 좀 더 연구해야합니다. 어떤 형태의 수술을 제안합니까? 가우스 블러 같은 것이 있습니까? 테이블이 균일하게 비춰져도 상관 없습니까? – vince88

+0

나는이 방법을 사용하면 함께 모여있는 볼의 위치를 ​​감지하기가 더 어려워진다는 것을 깨달았습니다. 그들은 그냥 큰 얼룩으로 나오 겠지요, 그렇죠? – vince88

+0

그래, 그렇기 때문에 나는 Hough circles 전체를 포기할 것을 제안하지 않는다.어쩌면이 방법들을 함께 사용할 수 있습니다. 클러스터를 분리하기 위해 몇 가지 기본 세분화 기법을 시도해 볼 수 있습니다. –

0

나는 풀과 스누커를 플레이 한 이래로이 문제에 대해서도 생각해 보았습니다.

몇 점 : 당신은 에지 포인트를 필터링하지 않는 것처럼

  1. 허프 원 적합으로 판단, 그것은 보이는, 또는 가장자리 강도에 대한 임계 값은 충분히 높지 않다. 가장자리 점에 이진 지시기를 사용하고 있습니까? 아니면 가장자리 강도를 기준으로 가장자리 점을 선택하고 있습니까?
  2. RGB 공간에서 작업 할 수 있습니까? 테이블 침대, 레일을 감지하고 볼을 식별하는 데 도움이됩니다. 테이블 침대의 파란색 얼룩은 2 구, 10 구 또는 아마도 분필의 덩어리 일 수 있습니다.
  3. 매개 변수 공간에서 매우 제한된 반경의 원 검색을 제한 할 수 있어야합니다. 이것은 부분적으로 도움이 될 것입니다 ...
  4. 테이블 표면과 레일을 감지하십시오. 획 폭 변환은 레일을 찾을 때 도움이 될 수 있습니다. 특히 레일의 콘트라스트가 높은 색상 평면 (녹색)을 검색하는 경우 특히 유용합니다. 여섯 개의 포켓 (또는 적어도 세 개의 포켓)을 사용하여 테이블의 자세 (위치 및 방향)를 식별 할 수 있습니다.
  5. 일단 레일이 감지되면 아핀 변환을 사용하여 원근 왜곡을 수정할 수 있습니다. 특히 어른 한 포켓 또는 스트레이트 풀을 플레이하는 사람과 같은 심각한 수영장 플레이어를 만족 시키려면 공이 배치되기를 원한다면 어떤 방식 으로든 볼을 배치하려면이 작업을 수행해야합니다. 어파 인 변환을하면, Hough 매개 변수 공간에서 반경에 대한 공차를 상당히 설정할 수 있습니다.
  6. 테이블 침대를 발견하면 초기 분류 (즉, 지역 레이블 지정 또는 얼룩 찾기)를 수행하고 특정 영역 및 진원의 얼룩만을 검색 할 수 있습니다.
  7. 강하고 균일 한 확산 된 오버 헤드 라이트는 그림자를 제거하는 데 도움이 될 수 있습니다.
  8. 평행선 그라디언트가있는 다른 가장자리 점을 향하는 그라디언트가있는 가장자리 점을 받거나 (또는 ​​적어도 선호하는) 가장자리 점을 필터링 할 수 있습니다. 에지 포인트 쌍의 로컬 콜렉션이 에지 그라디언트를 통해 서로 "포인트"한다면, 이들은 검출을위한 좋은 후보가됩니다.
  9. 후보 공을 찾으면 추가 처리를 수행하여 수락/거부합니다. 공은 비교적 균일 한 색조 (큐볼, 1-8 또는 적절한 각도에서 보인 줄무늬)이거나 감지 가능한 색 줄무늬와 흰색을 가져야합니다. 볼 표면은 테이블의 나뭇결과 같이 매우 짜임새가 없습니다.
  10. 사용자가 두 개의 다른 각도에서 두 개의 사진을 찍을 수있는 옵션이 있습니다. 그런 다음 공을 찾을 수있는 두 가지 기회가 있으며, 두 개의 이미지에서 테이블과 볼을 일치시키는 대응 문제를 해결하여 테이블 공간의 2D 공간에서 볼을 찾을 수 있습니다.
  11. 정규화 된 상호 상관 (간단한 템플릿 매칭)과 같은 두 번째 알고리즘을 사용하여 볼 또는 적어도 볼 위치를 식별하는 데 도움이됩니다.
  12. 이미지의 중심점이 테이블 침대의 어딘가에 위치해야한다고 주장하십시오. 이렇게하면 레일 모서리를 방사형으로 바깥쪽으로 검색 할 수 있기 때문에 레일의 위치를 ​​파악하는 데 도움이되며, 네 개 (또는 심지어 세 개)의 레일이 발견되면 그 너머의 방사형 거리에서 모서리 점을 거부 할 수 있습니다.

행운을 빌어 요! 그것은 재미있는 문제입니다.

편집 : 다른 StackOverflow 게시물을 읽고이 백서를 읽었습니다. 가장자리 점을 필터링하기 위해 제안한 기법에 대해 훨씬 더 자세하게 소개 할 것입니다 (항목 8).

는 라드, Faez 및 Qaragozlou 내가 그들의 알고리즘을 구현하지 않은 http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.121.9956

에 의해 "그라데이션 쌍 벡터를 사용하여 빠른 서클 감지"나 자신 아직,하지만 약속 같은데. 여기에 용지가 언급 한 포스트는 다음과 같습니다

Three Dimensional Hough Space