#define MASK_CENTER_SHIFT 4
#define MASK_CENTER (0x03 << 4)
-//number of results to select the most probable one from
+//number of results to select the most supported one from
#define DECISION_BOX_SIZE 5
//camera control system (if true, rozkuk recognizes, else it waits)
void displayFloatMat(const CvMat *floatMat, const char *windowName);
int modeRealtime(CvCapture* capture);
#endif /*----------- DEBUG SESSION ONLY -----------*/
-int modeRecognize(CvCapture* capture);
+int modeRecognize(CvCapture* capture, CORBA_octet currentColor);
int modeWait(CvCapture *capture);
int modeManager(int defaultMode);
int countThreshold(const IplImage *frame);
/** Implements the camera recognition of corns.
* In DEBUG session the results are also displayed on screen.
* @param capture Pointer to a camera capture.
+ * @param currentColor Number of starting color. If it changes in orte during
+ * recognition, this mode needs to restart (to load suitable masks).
* @return Code of mode to switch to. */
-int modeRecognize(CvCapture* capture) {
+int modeRecognize(CvCapture* capture, CORBA_octet currentColor) {
IplImage *frame = NULL; // frame from camera
IplImage *thresFrame = NULL; // thresholded frame
CvMat *floatMat = NULL; // float <-1,1> image of the frame
int pause=0; // set pause=1 to pause processing
#endif /*----------- DEBUG SESSION ONLY -----------*/
while(ORTE_CAMERA_CONTROL) {
+
+ //if color changed during recognition, restart the mode to load appropriate masks
+ if(orte.camera_control.game_color != currentColor) return MODE_RECOGNIZE;
#ifdef ROZKUK_DEBUG /************ DEBUG SESSION ONLY ************/
/* keyboard events handeling */
//recognize side and center configurations
sideConfig = recognize(floatMat, sideMasks, SIDEMASKSCNT, &sideDist);
centerConfig = recognize(floatMat, centerMasks, CENTERMASKSCNT, ¢erDist);
- fprintf(stderr, "SINGLE: thr: %3d, side: %d (%f), center: %d (%f)\n", threshold, sideConfig, sideDist, centerConfig, centerDist);
+ fprintf(stderr, "SINGLE: thr: %3d, side: %d (%.2f), center: %d (%.2f)\n", threshold, sideConfig, sideDist, centerConfig, centerDist);
//push the results to the decision box and get "averaged" solutions from it
sideBox.insertItem(sideConfig, sideDist);
centerBox.insertItem(centerConfig, centerDist);
orte.camera_result.sideDist = sideDist;
orte.camera_result.centerDist = centerDist;
ORTEPublicationSend(orte.publication_camera_result);
- fprintf(stderr, "ORTE: side: %d (%f), center: %d (%f)\n", sideConfig, sideDist, centerConfig, centerDist);
+ fprintf(stderr, "ORTE: side: %d (%.2f), center: %d (%.2f)\n", sideConfig, sideDist, centerConfig, centerDist);
#ifdef ROZKUK_DEBUG /************ DEBUG SESSION ONLY ************/
displayProduct(floatMat, sideConfig, centerConfig);
int mode=defaultMode;
int ret;
CvCapture* capture;
+ CORBA_octet color;
// connect to a camera
while(!((capture=cvCaptureFromCAM(0)) || (capture=cvCaptureFromCAM(1)))) {
cvMoveWindow(WINDOW_PROD, cvQueryFrame(capture)->width, cvQueryFrame(capture)->height+50);
#endif /*----------- DEBUG SESSION ONLY -----------*/
//load masks and run recognition mode, then free masks (they are in memory only while in recognition mode)
- if((ret=loadMasks((orte.camera_control.game_color==BLUE ? clBLUE : clYELLOW)))) return ret;
- mode = modeRecognize(capture);
+ color = orte.camera_control.game_color;
+ if((ret=loadMasks((color==BLUE ? clBLUE : clYELLOW)))) return ret;
+ mode = modeRecognize(capture, color);
freeMasks();
break;