int main(int argc, char** argv) { if (argc == 1) { printf("Usage: %s <input> <config>\n", argv[0]); return 0; } char* filename = (argc > 1 ? argv[1] : (char*)"input.jpg"); profile_name = (argc > 2 ? argv[2] : (char*)"blue_goal.yml"); fs = cvOpenFileStorage(profile_name, 0, CV_STORAGE_READ, NULL); Hmax = cvReadIntByName(fs, NULL, "m_100", m_100); Hmax = cvReadIntByName(fs, NULL, "Hmax", Hmax); Smax = cvReadIntByName(fs, NULL, "Smax", Smax); Vmax = cvReadIntByName(fs, NULL, "Vmax", Vmax); Hmin = cvReadIntByName(fs, NULL, "Hmin", Hmin); Smin = cvReadIntByName(fs, NULL, "Smin", Smin); Vmin = cvReadIntByName(fs, NULL, "Vmin", Vmin); //minH = cvReadIntByName(fs, NULL, "minH", minH); printf("%s\n", filename); img = cvLoadImage(filename, 1); visy_img_alloc(&img, cvGetSize(img), 8, 1); imgThreshed = cvCreateImage(cvGetSize(img), 8, 1); //cvSmooth( imgHSV, imgHSV, CV_GAUSSIAN, 7, 7 ); //cvInRangeS(imgHSV, cvScalar(20, 100, 100), cvScalar(30, 255, 255), imgThreshed); //cvInRangeS(imgHSV, cvScalar(100, 100, 100), cvScalar(120, 255, 255), imgThreshed); //cvInRangeS(imgHSV, cvScalar(0.11*256, 0.60*256, 0.20*256, 0), // cvScalar(0.14*256, 1.00*256, 1.00*256, 0), imgThreshed); cvNamedWindow("origin", CV_WINDOW_AUTOSIZE); cvNamedWindow("treshed", CV_WINDOW_AUTOSIZE); cvNamedWindow("graph", CV_WINDOW_AUTOSIZE); cvCreateTrackbar("m_100", "treshed", &m_100, 255, onTrack); cvCreateTrackbar("Hmin", "treshed", &Hmin, 180, onTrack); cvCreateTrackbar("Smin", "treshed", &Smin, 255, onTrack); cvCreateTrackbar("Vmin", "treshed", &Vmin, 255, onTrack); cvCreateTrackbar("Hmax", "treshed", &Hmax, 180, onTrack); cvCreateTrackbar("Smax", "treshed", &Smax, 255, onTrack); cvCreateTrackbar("Vmax", "treshed", &Vmax, 255, onTrack); //cvCreateTrackbar("minH", "treshed", &minH, 255, onTrack); onTrack(0); //cvSaveImage("hsv.jpg", imgHSV); while(cvWaitKey(0) != 97); return 0; }
int main(int argc, char** argv) { profile_name = (argc > 1 ? argv[1] : (char*)"blue_goal.yml"); int cam = (argc > 2 ? atoi(argv[2]) : 0); // value loading fs = cvOpenFileStorage(profile_name, 0, CV_STORAGE_READ, NULL); Hmax = cvReadIntByName(fs, NULL, "Hmax", Hmax); Smax = cvReadIntByName(fs, NULL, "Smax", Smax); Vmax = cvReadIntByName(fs, NULL, "Vmax", Vmax); Hmin = cvReadIntByName(fs, NULL, "Hmin", Hmin); Smin = cvReadIntByName(fs, NULL, "Smin", Smin); Vmin = cvReadIntByName(fs, NULL, "Vmin", Vmin); minH = cvReadIntByName(fs, NULL, "minH", minH); cvNamedWindow("img", CV_WINDOW_AUTOSIZE); cvNamedWindow("treshed", CV_WINDOW_AUTOSIZE); cvNamedWindow("graph", CV_WINDOW_AUTOSIZE); cvCreateTrackbar("Hmin", "treshed", &Hmin, 360, onTrack); cvCreateTrackbar("Smin", "treshed", &Smin, 255, onTrack); cvCreateTrackbar("Vmin", "treshed", &Vmin, 255, onTrack); cvCreateTrackbar("Hmax", "treshed", &Hmax, 360, onTrack); cvCreateTrackbar("Smax", "treshed", &Smax, 255, onTrack); cvCreateTrackbar("Vmax", "treshed", &Vmax, 255, onTrack); cvCreateTrackbar("minH", "treshed", &minH, 255, onTrack); onTrack(0); CvCapture* camera = cvCaptureFromCAM(cam); while(1){ img = cvQueryFrame(camera); allocateCvImage(&imgHSV, cvGetSize(img), 8, 3); cvCvtColor(img, imgHSV, CV_BGR2HSV); allocateCvImage(&imgThreshed, cvGetSize(img), 8, 1); cvInRangeS(imgHSV, cvScalar(Hmin, Smin, Vmin, 0), cvScalar(Hmax, Smax, Vmax, 0), imgThreshed); cvErode(imgThreshed, imgThreshed, 0, 2); int width = imgThreshed->width; int height = imgThreshed->height; int nchannels = imgThreshed->nChannels; int step = imgThreshed->widthStep; uchar* data = (uchar *)imgThreshed->imageData; unsigned int graph[width]; int x,y; for(x = 0; x < width ; x++) graph[x] = 0; int sum = 0, notnull = 0; for(x = 0; x < width; x++){ for( y = 0 ; y < height ; y++ ) { if(data[y*step + x*nchannels] == 255){ graph[x]++; } } sum += graph[x]; if(graph[x] != 0) notnull += 1; // printf("%d\t%d\n", x, graph[x]); } if(notnull == 0) notnull = 1; int average = sum/notnull; if(average == 0) average = 1; float pix = 12.0/average; printf("\n sum: %d average: %d\n",sum,average); int first = 0, last = 0; // looking for goal for(x = 0;x < width; x++){ if(graph[x] >= average && graph[x-1] < average){ cvLine(img, cvPoint(x, 0), cvPoint(x, height), cvScalar(255, 255, 0, 0), 1, 0, 0); if(first == 0) first = x; } if(graph[x] >= average && graph[x+1] < average){ cvLine(img, cvPoint(x, 0), cvPoint(x, height), cvScalar(255, 255, 0, 0), 1, 0, 0); last = x; } } float goal = pix*(last-first); float error = (goal-60.0)/60.0*100.0; printf("Pix: %f; Goal in cm: %f; Error: %f%\n", pix, goal, error); // image center cvLine(img, cvPoint(width/2, 0), cvPoint(width/2, height), cvScalar(0, 255, 255, 0), 1, 0, 0); int gCenter = (last+first) / 2; // X float X = ((width/2) - gCenter)*pix; printf("X: %f +- %f\n",X, abs(error)/100.0*X); // goal center cvLine(img,cvPoint(gCenter, 0),cvPoint(gCenter, height), cvScalar(0, 0, 255, 0), 1, 0, 0); cvShowImage("img", img); cvShowImage("treshed", imgThreshed); //cvShowImage("graph", imgGraph); cvWaitKey(10); } }
INT_PTR Twindow::msgProc(UINT uMsg,WPARAM wParam,LPARAM lParam) { switch (uMsg) { case WM_INITDIALOG: resizeDialog(); init(); //subClass(); break; case WM_DESTROY: { THWNDs wnds; getChildWindows(m_hwnd,wnds); for (THWNDs::const_iterator wnd=wnds.begin(); wnd!=wnds.end(); wnd++) { ::Twidget *item=Twidget::getDlgItem(*wnd); if (item) { item->restore(); delete item; } } ::Twidget *item=Twidget::getDlgItem(m_hwnd); if (item) { item->restore(); delete item; } if (red) { DeleteObject(red); } red=NULL; break; } case WM_HSCROLL: if (onTrack(bindsHtrack,lParam)) { return TRUE; } break; case WM_VSCROLL: if (onTrack(bindsVtrack,lParam)) { return TRUE; } break; case WM_COMMAND: { if (bindsCheckbox) for (int i=0; bindsCheckbox[i].idc; i++) if (bindsCheckbox[i].idc==LOWORD(wParam)) { if (bindsCheckbox[i].idff<0) { cfgSet(-bindsCheckbox[i].idff,!getCheck(LOWORD(wParam))); } else { cfgSet(bindsCheckbox[i].idff,getCheck(LOWORD(wParam))); } if (bindsCheckbox[i].onClick) { (this->*bindsCheckbox[i].onClick)(); } return TRUE; } if (bindsRadiobutton) for (int i=0; bindsRadiobutton[i].idc; i++) if (bindsRadiobutton[i].idc==LOWORD(wParam) && getCheck(LOWORD(bindsRadiobutton[i].idc))) { cfgSet(bindsRadiobutton[i].idff,bindsRadiobutton[i].val); if (bindsRadiobutton[i].onClick) { (this->*bindsRadiobutton[i].onClick)(); } return TRUE; } if (bindsButton) if (HIWORD(wParam)==BN_CLICKED) // works also for static for (int i=0; bindsButton[i].idc; i++) if (bindsButton[i].idc==LOWORD(wParam) && bindsButton[i].onClick) { (this->*bindsButton[i].onClick)(); return TRUE; } if (HIWORD(wParam)==EN_CHANGE && !isSetWindowText) { if (LOWORD(wParam)==IDC_ED_HELP && tr->translateMode) { onEditChange(); } if (bindsEditInt) for (int i=0; bindsEditInt[i].idc; i++) if (bindsEditInt[i].idc==LOWORD(wParam)) { HWND hed=GetDlgItem(m_hwnd,bindsEditInt[i].idc); if (hed!=GetFocus()) { return FALSE; } repaint(hed); eval(hed,bindsEditInt[i].min,bindsEditInt[i].max,bindsEditInt[i].idff); if (bindsEditInt[i].onClick) { (this->*bindsEditInt[i].onClick)(); } return TRUE; } if (bindsEditReal) for (int i=0; bindsEditReal[i].idc; i++) if (bindsEditReal[i].idc==LOWORD(wParam)) { HWND hed=GetDlgItem(m_hwnd,bindsEditReal[i].idc); if (hed!=GetFocus()) { return FALSE; } repaint(hed); eval(hed,bindsEditReal[i].min,bindsEditReal[i].max,bindsEditReal[i].idff,bindsEditReal[i].mult); if (bindsEditReal[i].onClick) { (this->*bindsEditReal[i].onClick)(); } return TRUE; } } else if (HIWORD(wParam)==CBN_SELCHANGE) { if (bindsCombobox) for (int i=0; bindsCombobox[i].idc; i++) if (bindsCombobox[i].idc==LOWORD(wParam)) { switch (bindsCombobox[i].mode) { case BINDCBX_DATA: cfgSet(bindsCombobox[i].idff,(int)cbxGetCurItemData(bindsCombobox[i].idc)); break; case BINDCBX_SEL: cfgSet(bindsCombobox[i].idff,cbxGetCurSel(bindsCombobox[i].idc)); break; case BINDCBX_TEXT: cfgSet(bindsCombobox[i].idff,cbxGetCurText(bindsCombobox[i].idc)); break; case BINDCBX_DATATEXT: cfgSet(bindsCombobox[i].idff,(const char_t*)cbxGetCurItemData(bindsCombobox[i].idc)); break; } if (bindsCombobox[i].onClick) { (this->*bindsCombobox[i].onClick)(); } return TRUE; } } break; } case WM_CTLCOLOREDIT: if (bindsEditInt) if (onCtlColorEdit(bindsEditInt,lParam,wParam)) { return INT_PTR(getRed()); } if (bindsEditReal) if (onCtlColorEdit(bindsEditReal,lParam,wParam)) { return INT_PTR(getRed()); } break; } return defMsgProc(uMsg,wParam,lParam); }