2012-11-20 180 views
1

現在我控制機器人運行井字棋遊戲
但我不知道如何使用opencv庫來識別遊戲板和內部廣場
我不知道如何使用algoritm獲得遊戲板和9X9遊戲廣場的一角使用opencv的井字遊戲,但我可以停止當識別遊戲板

這是我做的拿到角球

二值圖像:

cvFindContours:

#include <stdio.h> 
#include <fcntl.h> 
#include <cv.h> 
#include <cxcore.h> 
#include <highgui.h> 

int main(void){ 
IplImage *img=NULL; 
IplImage *gray=NULL; 
CvMemStorage* contour_storage; 
CvSeq* contours=NULL; 
CvPoint2D32f *corners; 

img = cvLoadImage("tictactoe.bmp",CV_LOAD_IMAGE_COLOR); 
gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); 

cvSmooth(img, img, CV_GAUSSIAN, 3, 0, 0, 0); 
cvCvtColor(img, gray, CV_RGB2GRAY); 
cvAdaptiveThreshold(gray, gray, 128,CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, 3, 5); 
cvNamedWindow("Threshold", CV_WINDOW_AUTOSIZE); 
cvShowImage("Threshold", gray); 

contour_storage = cvCreateMemStorage(0); 
corners = (CvPoint2D32f *)malloc(sizeof(CvPoint2D32f)*9); 
cvFindContours(gray, contour_storage, &contours, sizeof (CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 
cvDrawContours(img, contours, CV_RGB(255,0,0), CV_RGB(0,255,0), 2, 4, 8, cvPoint(0,0)); 

cvNamedWindow("Calibration", CV_WINDOW_AUTOSIZE); 
cvShowImage("Calibration", img); 

cvWaitKey(0); 

return 0; 
} 

我不知道如何處理圖像處理以執行遊戲

這Progmram僅限於使用C代碼和OpenCV 1.x的運行使用臂嵌入板

請讓我知道如何使用opencv開發此遊戲

回答

2

我到目前爲止只使用了C++接口,所以我不知道需要調用的函數的確切名稱。不過,這裏有一個粗略的算法,我會用它來達到你想要的東西的描述,所以你有幾個關鍵詞,你可以看一下:

  • 由於攝像機圖像清楚地扭曲,通過彎曲的電路板線路識別,你應該開始校準你的相機。如果您總是使用相同的相機,或者至少使用相同焦距的相同型號,則只需執行一次。關於此的快速教程可以在here找到。 This是一個更詳細的教程,更多的數學,不幸的是他使用的是C++函數。

  • 下一步將被檢測的板的細胞。我認爲這可以通過使用Hough Line Transform(也稱爲C++),然後計算線交點來實現,因此您可以定義單元格。

  • 如果你希望你的軟件自動把它的回合,你可以使用一個運動檢測器,以確定是否有當前沒有運動,然後採取行動。背景扣除是一個簡單的方法來做到這一點。我沒有找到合適的解釋,只是做一個谷歌搜索。

  • 之後,你必須找到圈和十字架。圈子更容易,因爲還有Hough Circle Transform。十字架更棘手。我會通過考慮細胞的對角線來估計十字線的長度,並再次使用霍夫線檢測器。我這裏提到

一切詳細(但不要太理論上)在this本書,我學習OpenCV的時候發現非常有用得到解釋。他們甚至使用C接口。