void AgiEngine::selectItems(int n) { int fsel = 0; bool exit_select = false; while (!exit_select && !(shouldQuit() || _restartGame)) { if (n > 0) printItem(fsel, STATUS_BG, STATUS_FG); switch (waitAnyKey()) { case KEY_ENTER: setvar(vSelItem, _intobj[fsel]); exit_select = true; break; case KEY_ESCAPE: setvar(vSelItem, 0xff); exit_select = true; break; case KEY_UP: if (fsel >= 2) fsel -= 2; break; case KEY_DOWN: if (fsel + 2 < n) fsel += 2; break; case KEY_LEFT: if (fsel % 2 == 1) fsel--; break; case KEY_RIGHT: if (fsel % 2 == 0 && fsel + 1 < n) fsel++; break; case BUTTON_LEFT:{ int i = findItem(); if (i >= 0 && i < n) { setvar(vSelItem, _intobj[fsel = i]); debugC(6, kDebugLevelInventory, "item found: %d", fsel); showItems(); printItem(fsel, STATUS_BG, STATUS_FG); _gfx->doUpdate(); exit_select = true; } break; } default: break; } if (!exit_select) { showItems(); _gfx->doUpdate(); } } debugC(6, kDebugLevelInventory, "selected: %d", fsel); }
/** * Display inventory items. */ void AgiEngine::inventory() { int oldFg, oldBg; int n; // screen is white with black text oldFg = _game.colorFg; oldBg = _game.colorBg; _game.colorFg = 0; _game.colorBg = 15; _gfx->clearScreen(_game.colorBg); switch (getLanguage()) { case Common::RU_RUS: printText(YOUHAVE_MSG_RU, 0, YOUHAVE_X_RU, YOUHAVE_Y_RU, 40, STATUS_FG, STATUS_BG); break; default: printText(YOUHAVE_MSG, 0, YOUHAVE_X, YOUHAVE_Y, 40, STATUS_FG, STATUS_BG); break; } // FIXME: doesn't check if objects overflow off screen... _intobj = (uint8 *)malloc(4 + _game.numObjects); memset(_intobj, 0, (4 + _game.numObjects)); n = showItems(); switch (getLanguage()) { case Common::RU_RUS: if (getflag(fStatusSelectsItems)) { printText(SELECT_MSG_RU, 0, SELECT_X_RU, SELECT_Y_RU, 40, STATUS_FG, STATUS_BG); } else { printText(ANY_KEY_MSG_RU, 0, ANY_KEY_X_RU, ANY_KEY_Y_RU, 40, STATUS_FG, STATUS_BG); } break; default: if (getflag(fStatusSelectsItems)) { printText(SELECT_MSG, 0, SELECT_X, SELECT_Y, 40, STATUS_FG, STATUS_BG); } else { printText(ANY_KEY_MSG, 0, ANY_KEY_X, ANY_KEY_Y, 40, STATUS_FG, STATUS_BG); } break; } _gfx->flushScreen(); // If flag 13 is set, we want to highlight & select an item. // opon selection, put objnum in var 25. Then on esc put in // var 25 = 0xff. if (getflag(fStatusSelectsItems)) selectItems(n); free(_intobj); if (!getflag(fStatusSelectsItems)) waitAnyKey(); _gfx->clearScreen(0); writeStatus(); _picture->showPic(); _game.colorFg = oldFg; _game.colorBg = oldBg; _game.hasPrompt = 0; flushLines(_game.lineUserInput, 24); }
/*This method packs the whole algorithm in one single function. * If the basic mode for the webcam usage in the SettingObject is set, * then it will return the following states: * It returns -1 if an error occurs (i. e. the src image is empty) * It returns 0 if no barcode on the image was detected * It returns 1 if one or more barcodes were detected * * Furthermore it reads all the settings from the SettingObject, * to check if additionally informations should be shown. * */ int get_Barcode( Mat& src, SettingObject& s) { if (!s.isBasic()) { s.printSettings(); } /// Load source image, convert it to gray and blur it // Mat src; //, gray; //sample images for testing purposes: // src = get_image_from_webcam(); // src = imread("media/gut/joghurt_scaled.jpg"); // src = imread("media/gut/highQu_scaled.jpg"); // src = imread("media/gut/toffifee_scaled.jpg"); // src = imread("media/gut/mandarine_scaled.jpg"); // src = imread("media/gut/bottle_scaled.jpg"); // src = imread("media/internet/test.png"); // src = imread("media/internet/Chips_rotated.jpg", CV_LOAD_IMAGE_COLOR); // src = imread("media/internet/per_verzerrt.jpg", CV_LOAD_IMAGE_COLOR); // src = imread("media/internet/chips.jpg", CV_LOAD_IMAGE_COLOR); // src = imread("media/gut/mandarine.jpg", CV_LOAD_IMAGE_COLOR); // src = imread("media/internet/Gefro Pesto Verde (2).jpg", CV_LOAD_IMAGE_COLOR); // src = imread("media/internet/Knorr fix Bolognese (3).JPG", CV_LOAD_IMAGE_COLOR); // src = imread("media/internet/Knorr fix Bolognes Tomaten-Mozarella (4).JPG", CV_LOAD_IMAGE_COLOR); //blank = imread("media/blank2.jpg", CV_LOAD_IMAGE_COLOR); if (src.empty()) { cout << "src is empty!" << endl; return -1; } // blank = imread("media/blank2.jpg", CV_LOAD_IMAGE_COLOR); int pxl_Sum = src.cols * src.rows; if (!s.isBasic()) { cout << "pxl_Sum: " << pxl_Sum << endl; } // Mat canny_output; Mat bw_thresh, gray; prepareSrc(src, bw_thresh, gray); // medianBlur ( gray, gray, 3 ); if (s.isShowAllSteps()) { namedWindow("Source", CV_WINDOW_AUTOSIZE); imshow("Source", src); waitAnyKey(s); namedWindow( "Gray", CV_WINDOW_AUTOSIZE ); imshow( "Gray", gray ); waitAnyKey(s); } // find_moments(canny_output, 3, skel3, gray.size()); vector<ContourObject> vecCO(find_mser(gray, s)); if (!s.isBasic()) { cout << "vecCO.size() = " << vecCO.size() << endl; } Mat mfiltered = Mat::zeros( src.size(), CV_8UC3 ); // skel3.copyTo(mfiltered); // cvtColor(mfiltered, mfiltered, CV_GRAY2BGR); vector<ContourObject> fVecCO(filter_by_rect(vecCO, bw_thresh, .4, 5 )); //.95, 7 vector<ContourObject> fVecCO2(fVecCO); // vector<ContourObject> fVecCO2(filter_by_dst(fVecCO, pxl_Sum, 0.0003, skel3.size() )); //0.00001 if (!s.isBasic()) { cout << "fVecCO.size(): " << fVecCO.size() << endl; cout << "fVecCO2.size(): " << fVecCO2.size() << endl; } draw_minRectangles(fVecCO2, mfiltered); if (s.isShowAllSteps()) { namedWindow("mFiltered", CV_WINDOW_AUTOSIZE); //CV_WINDOW_NORMAL imshow("mFiltered", mfiltered); waitAnyKey(s); } //cluster_rect was previously used to find potential barcode areas /* Mat cluster = Mat::zeros(mfiltered.size(),CV_8UC1); //cout << "mfilteed size: " << mfiltered.size(); cluster_rect(cluster, fVecCO2); */ Mat mCenter = draw_massCenter(fVecCO2, mfiltered.size(), s); vector<Vec4i> pLines = get_probabilistic_hough_lines(mCenter); if (!s.isBasic()) { /// Show the result cout << "p_line.size(): " << pLines.size() << endl; } vector<Vec4i> fLines = filter_hough_lines2(pLines); if (!s.isBasic()) { cout << "f_line.size(): " << fLines.size() << endl; } // cout << "length norm(fLines[0]): " << norm(fLines[0]) << endl; if (s.isShowAllSteps()) { draw_hough_lines(mCenter, fLines); waitAnyKey(s); } vector<vector<Point2f> > cornerPoints = get_corner_points(fLines, fVecCO2, src.clone(), s); if (s.isShowAllSteps()) { waitAnyKey(s); } //find_groups(mfiltered, vector<ContourObject> fVecCO2); vector<Mat> mBarcodes; mBarcodes = p_transform(src, cornerPoints, s); waitAnyKey(s); /*vector<string> barcode; vector<string> type; vector<float> angle;*/ string barcode; string type; float angle; bool readSuccess = false; size_t mBarcodesSize = mBarcodes.size(); if (mBarcodesSize > 0) { for (size_t i = 0; i < mBarcodes.size(); i++) { readSuccess = get_barcode_string(mBarcodes[i], barcode, type, angle, i, s); if (readSuccess) { cout << "Barcode was successfully decoded." << endl; cout << "type: " << type << endl; cout << "barcode-symbol: " << barcode << endl; cout << "angle: " << angle << endl; // string speak = string("espeak.exe -v de \"") + string("Typ: ") + type + string("barcode: ") + barcode + string("\""); // int retCode = system(speak.c_str()); if (s.isBasic()) { return 1; } } else { if (!s.isBasic()) { cout << "no barcode could be read." << endl; } } //if the transformation failed to be read, sent the whole src image to zBar if (i == mBarcodesSize-1 && barcode.length() == 0) { //add the source image to the list Mat src_bw; src.copyTo(src_bw); make_adaptiv_bw(src_bw); mBarcodes.push_back(src_bw); mBarcodes.push_back(src); } } } String article, descr; // article = "Dontodent - Fresh White Zahnpflegekaugummis"; // descr = "Zuckerfreie Kaugummi-Dragées mit Süßungsmitteln und Aroma glutenfrei laktosefrei "; // speak_article_descr(article, descr); bool searchSuccess = false; // cout << "type.: " << type << endl; if ( !s.isBasic() && type.find("EAN") != unsigned(-1) ) { const char* pathProductCSV = "media/database/product_database.csv"; const char* pathAdderCSV = "media/database/adder_database.csv"; cout << "i want to search!" << s.isSearch() << endl; waitAnyKey(s); searchSuccess = get_article_descr_csv(pathProductCSV, barcode, article, descr) || get_article_descr_csv(pathAdderCSV, barcode, article, descr); if (searchSuccess) { cout << "article:" << article << endl; cout << "beschr: " << descr << endl; } else if (s.isSearch()){ cout << "look-up at codecheck.info..." << endl; searchSuccess = get_article_description_internet(barcode, article, descr); if (searchSuccess) { add_article_descr_to_csv(pathAdderCSV, barcode, article, descr); } } } if (searchSuccess) { // cout << "article: " << article << endl; draw_article_description(article, descr); if (s.isSpeach()) { speak_article_descr(article, descr); } } else if (!s.isBasic()){ cout << "no article description was found." << endl; } if (!s.isBasic()) { waitKey(0); } return (0); }