int CVICALLBACK Load_Picture (int panel, int control, int event, void *callbackData, int eventData1, int eventData2) { char picname[512] = {'\0'}; int ret = 0; HistogramReport *report = NULL; switch (event) { case EVENT_COMMIT: ret = FileSelectPopup ("", "*.*", "", "Load; select an image file", VAL_LOAD_BUTTON, 0, 0, 1, 0, picname); if (ret == 1) { imaqReadFile (sourimage, picname, NULL, NULL); imaqMoveWindow (0, imaqMakePoint (50, 260)); imaqDisplayImage (sourimage, 0, TRUE); report = imaqHistogram (sourimage, 256, 0, 255, IMAQ_IMAGE_U8); DeleteGraphPlot (mypanel, MYPANEL_MYGRAPH, -1, VAL_IMMEDIATE_DRAW); PlotY (mypanel, MYPANEL_MYGRAPH, (*report).histogram, 256, VAL_UNSIGNED_INTEGER, VAL_THIN_LINE, VAL_EMPTY_SQUARE, VAL_SOLID, 1, VAL_RED); } break; } return 0; }
/** * Create a new image by loading a file. * @param fileName The path of the file to load. */ HSLImage::HSLImage(const char *fileName) : ColorImage(IMAQ_IMAGE_HSL) { int success = imaqReadFile(m_imaqImage, fileName, NULL, NULL); //printf("HSLImage Success at Reading is %d\n",success); //wpi_setImaqErrorWithContext(success, "Imaq ReadFile error"); if(success <= 0) { printf("!!!Error!!! | %s | %s\n",imaqGetErrorText(imaqGetLastError()), imaqGetLastErrorFunc()); } }
/** * Create a new image by loading a file. * * @param fileName The path of the file to load. */ RGBImage::RGBImage(const char* fileName) : ColorImage(IMAQ_IMAGE_RGB) { int success = imaqReadFile(m_imaqImage, fileName, nullptr, nullptr); wpi_setImaqErrorWithContext(success, "Imaq ReadFile error"); }
/** * @brief Creates image object from the information in a file. The file can be in one of the following formats: * PNG, JPEG, JPEG2000, TIFF, AIPD, or BMP. * Supports IMAQ_IMAGE_U8, IMAQ_IMAGE_I16, IMAQ_IMAGE_SGL, IMAQ_IMAGE_COMPLEX, IMAQ_IMAGE_RGB, IMAQ_IMAGE_HSL, IMAQ_IMAGE_RGB_U64. * * @param image Image read in * @param fileName File to read. Cannot be NULL * * @return On success: 1. On failure: 0. To get extended error information, call GetLastError(). */ int frcReadImage(Image* image, const char* fileName) { return imaqReadFile(image, fileName, NULL, NULL); }
/** * @brief Creates image object from the information in a file. The file can be * in one of the following formats: * PNG, JPEG, JPEG2000, TIFF, AIPD, or BMP. * Supports IMAQ_IMAGE_U8, IMAQ_IMAGE_I16, IMAQ_IMAGE_SGL, IMAQ_IMAGE_COMPLEX, * IMAQ_IMAGE_RGB, IMAQ_IMAGE_HSL, IMAQ_IMAGE_RGB_U64. * * @param image Image read in * @param fileName File to read. Cannot be nullptr * * @return On success: 1. On failure: 0. To get extended error information, call * GetLastError(). */ int frcReadImage(Image* image, const char* fileName) { return imaqReadFile(image, fileName, nullptr, nullptr); }
/** * Create a new image by loading a file. * @param fileName The path of the file to load. */ RGBImage::RGBImage(const char *fileName) : ColorImage(IMAQ_IMAGE_RGB) { int success = imaqReadFile(m_imaqImage, fileName, NULL, NULL); wpi_imaqAssert(success, "Imaq ReadFile error"); }
void Autonomous() override { while (IsAutonomous() && IsEnabled()) { //read file in from disk. For this example to run you need to copy image20.jpg from the SampleImages folder to the //directory shown below using FTP or SFTP: http://wpilib.screenstepslive.com/s/4485/m/24166/l/282299-roborio-ftp imaqError = imaqReadFile(frame, "//NewDir//image2.jpg", NULL, NULL); //Update threshold values from SmartDashboard. For performance reasons it is recommended to remove this after calibration is finished. TOTE_HUE_RANGE.minValue = SmartDashboard::GetNumber("Tote hue min", TOTE_HUE_RANGE.minValue); TOTE_HUE_RANGE.maxValue = SmartDashboard::GetNumber("Tote hue max", TOTE_HUE_RANGE.maxValue); TOTE_SAT_RANGE.minValue = SmartDashboard::GetNumber("Tote sat min", TOTE_SAT_RANGE.minValue); TOTE_SAT_RANGE.maxValue = SmartDashboard::GetNumber("Tote sat max", TOTE_SAT_RANGE.maxValue); TOTE_VAL_RANGE.minValue = SmartDashboard::GetNumber("Tote val min", TOTE_VAL_RANGE.minValue); TOTE_VAL_RANGE.maxValue = SmartDashboard::GetNumber("Tote val max", TOTE_VAL_RANGE.maxValue); //Threshold the image looking for yellow (tote color) imaqError = imaqColorThreshold(binaryFrame, frame, 255, IMAQ_HSV, &TOTE_HUE_RANGE, &TOTE_SAT_RANGE, &TOTE_VAL_RANGE); //Send particle count to dashboard int numParticles = 0; imaqError = imaqCountParticles(binaryFrame, 1, &numParticles); SmartDashboard::PutNumber("Masked particles", numParticles); //Send masked image to dashboard to assist in tweaking mask. SendToDashboard(binaryFrame, imaqError); //filter out small particles float areaMin = SmartDashboard::GetNumber("Area min %", AREA_MINIMUM); criteria[0] = {IMAQ_MT_AREA_BY_IMAGE_AREA, areaMin, 100, false, false}; imaqError = imaqParticleFilter4(binaryFrame, binaryFrame, criteria, 1, &filterOptions, NULL, NULL); //Send particle count after filtering to dashboard imaqError = imaqCountParticles(binaryFrame, 1, &numParticles); SmartDashboard::PutNumber("Filtered particles", numParticles); if(numParticles > 0) { //Measure particles and sort by particle size std::vector<ParticleReport> particles; for(int particleIndex = 0; particleIndex < numParticles; particleIndex++) { ParticleReport par; imaqMeasureParticle(binaryFrame, particleIndex, 0, IMAQ_MT_AREA_BY_IMAGE_AREA, &(par.PercentAreaToImageArea)); imaqMeasureParticle(binaryFrame, particleIndex, 0, IMAQ_MT_AREA, &(par.Area)); imaqMeasureParticle(binaryFrame, particleIndex, 0, IMAQ_MT_CONVEX_HULL_AREA, &(par.ConvexHullArea)); imaqMeasureParticle(binaryFrame, particleIndex, 0, IMAQ_MT_BOUNDING_RECT_TOP, &(par.BoundingRectTop)); imaqMeasureParticle(binaryFrame, particleIndex, 0, IMAQ_MT_BOUNDING_RECT_LEFT, &(par.BoundingRectLeft)); imaqMeasureParticle(binaryFrame, particleIndex, 0, IMAQ_MT_BOUNDING_RECT_BOTTOM, &(par.BoundingRectBottom)); imaqMeasureParticle(binaryFrame, particleIndex, 0, IMAQ_MT_BOUNDING_RECT_RIGHT, &(par.BoundingRectRight)); particles.push_back(par); } sort(particles.begin(), particles.end(), CompareParticleSizes); //This example only scores the largest particle. Extending to score all particles and choosing the desired one is left as an exercise //for the reader. Note that the long and short side scores expect a single tote and will not work for a stack of 2 or more totes. //Modification of the code to accommodate 2 or more stacked totes is left as an exercise for the reader. scores.Trapezoid = TrapezoidScore(particles.at(0)); SmartDashboard::PutNumber("Trapezoid", scores.Trapezoid); scores.LongAspect = LongSideScore(particles.at(0)); SmartDashboard::PutNumber("Long Aspect", scores.LongAspect); scores.ShortAspect = ShortSideScore(particles.at(0)); SmartDashboard::PutNumber("Short Aspect", scores.ShortAspect); scores.AreaToConvexHullArea = ConvexHullAreaScore(particles.at(0)); SmartDashboard::PutNumber("Convex Hull Area", scores.AreaToConvexHullArea); bool isTote = scores.Trapezoid > SCORE_MIN && (scores.LongAspect > SCORE_MIN || scores.ShortAspect > SCORE_MIN) && scores.AreaToConvexHullArea > SCORE_MIN; bool isLong = scores.LongAspect > scores.ShortAspect; //Send distance and tote status to dashboard. The bounding rect, particularly the horizontal center (left - right) may be useful for rotating/driving towards a tote SmartDashboard::PutBoolean("IsTote", isTote); SmartDashboard::PutNumber("Distance", computeDistance(binaryFrame, particles.at(0), isLong)); } else { SmartDashboard::PutBoolean("IsTote", false); } Wait(0.005); // wait for a motor update time } }
/** * Create a new image by loading a file. * @param fileName The path of the file to load. */ HSLImage::HSLImage(const char *fileName) : ColorImage(IMAQ_IMAGE_HSL) { int success = imaqReadFile(m_imaqImage, fileName, NULL, NULL); wpi_setImaqErrorWithContext(success, "Imaq ReadFile error"); }