/** * Write a binary image to flash. * Writes the binary image to flash on the cRIO for later inspection. * @param fileName the name of the image file written to the flash. */ void BinaryImage::Write(const char *fileName) { RGBValue colorTable[256]; Priv_SetWriteFileAllowed(1); memset(colorTable, 0, sizeof(colorTable)); colorTable[0].R = 0; colorTable[1].R = 255; colorTable[0].G = colorTable[1].G = 0; colorTable[0].B = colorTable[1].B = 0; colorTable[0].alpha = colorTable[1].alpha = 0; imaqWriteFile(m_imaqImage, fileName, colorTable); }
void Target::SaveImages() { printf("Target::SaveImages\n"); long then = (long) GetFPGATime(); if (!imaqWriteFile(m_cameraImage.GetImaqImage(), "/tmp/0000-camera.bmp", NULL)) { printf("%s: imaqWriteFile(\"/tmp/0000-camera.bmp\") FAILED\n", __FUNCTION__); // ignore the error } if (!imaqWriteFile(m_monoImage.GetImaqImage(), "/tmp/0001-monoImage.bmp", NULL)) { printf("%s: imaqWriteFile(\"/tmp/0001-monoImage.bmp\") FAILED\n", __FUNCTION__); // ignore the error } if (!imaqWriteFile(m_threshold.GetImaqImage(), "/tmp/0002-threshold.bmp", m_falseColor)) { printf("%s: imaqWriteFile(\"/tmp/0002-threshold.bmp\") FAILED\n", __FUNCTION__); // ignore the error } if (!imaqWriteFile(m_convexHull.GetImaqImage(), "/tmp/0003-convexHull.bmp", m_falseColor)) { printf("%s: imaqWriteFile(\"/tmp/0003-convexHull.bmp\") FAILED\n", __FUNCTION__); // ignore the error } if (!imaqWriteFile(m_filtered.GetImaqImage(), "/tmp/0004-filtered.bmp", m_falseColor)) { printf("%s: imaqWriteFile(\"/tmp/0004-filtered.bmp\") FAILED\n", __FUNCTION__); // ignore the error } imaqMergeOverlay(m_overlay.GetImaqImage(), m_filtered.GetImaqImage(), m_falseColor, 256, NULL); OverlayParticle(&m_overlay, m_pTop); OverlayParticle(&m_overlay, m_pBottom); OverlayParticle(&m_overlay, m_pLeft); OverlayParticle(&m_overlay, m_pRight); OverlayCenter(&m_overlay, m_centerX, m_centerY); OverlayLimits(&m_overlay, m_leftX, m_centerX, m_rightX); imaqMergeOverlay(m_overlay.GetImaqImage(), m_overlay.GetImaqImage(), NULL, 0, NULL); if (!imaqWriteFile(m_overlay.GetImaqImage(), "/tmp/0005-overlay.bmp", FALSE)) { printf("%s: imaqWriteFile(\"/tmp/0005-overlay.bmp\") FAILED\n", __FUNCTION__); // ignore the error } long now = (long) GetFPGATime(); printf("%s: image save took %ld microseconds\n", __FUNCTION__, (now - then)); }
/** * @brief Write image to a file. * Supports IMAQ_IMAGE_U8, IMAQ_IMAGE_I16, IMAQ_IMAGE_SGL, IMAQ_IMAGE_COMPLEX, IMAQ_IMAGE_RGB, IMAQ_IMAGE_HSL, IMAQ_IMAGE_RGB_U64. * * The file type is determined by the extension, as follows: * * Extension File Type * aipd or .apd AIPD * .bmp BMP * .jpg or .jpeg JPEG * .jp2 JPEG2000 * .png PNG * .tif or .tiff TIFF * * *The following are the supported image types for each file type: * * File Types Image Types * AIPD all image types * BMP, JPEG 8-bit, RGB * PNG, TIFF, JPEG2000 8-bit, 16-bit, RGB, RGBU64 * * @param image Image to write * @param fileName File to read. Cannot be NULL. The extension determines the file format that is written. * * @return On success: 1. On failure: 0. To get extended error information, call GetLastError(). */ int frcWriteImage(const Image* image, const char* fileName) { RGBValue* colorTable = NULL; return imaqWriteFile(image, fileName, colorTable); }
/** * Writes an image to a file with the given filename. * Write the image to a file in the flash on the cRIO. * @param fileName The name of the file to write */ void ImageBase::Write(const char *fileName) { int success = imaqWriteFile(m_imaqImage, fileName, NULL); wpi_setImaqErrorWithContext(success, "Imaq Image writeFile error"); }
void OperatorControl(void) { myRobot.SetSafetyEnabled(false); AxisCamera &camera = AxisCamera::GetInstance("10.28.53.11"); camera.WriteResolution(AxisCamera::kResolution_320x240); camera.WriteRotation(AxisCamera::kRotation_180);//Flip image upside-down. camera.WriteCompression(80);//Compresses the image(?) camera.WriteBrightness(50);//Sets the brightness to 80 on a scale from 0-100 DriverStationLCD *screen = DriverStationLCD::GetInstance(); int count = 0; while(IsOperatorControl()) { screen->UpdateLCD(); count++; HSLImage* imgpointer; //declares a new hue saturation lum image imgpointer = camera.GetImage(); //grabs an image to initialize that image //imaqCreateImage(IMAQ_IMAGE_U8,) //imaqCast(NULL, imgpointer, IMAQ_IMAGE_U8, NULL, -1); BinaryImage* binImg = NULL; //declares a new binary image //ThresholdHSL changes our regular image into a binary image. /*hueLow Low value for hue hueHigh High value for hue saturationLow Low value for saturation saturationHigh High value for saturation luminenceLow Low value for luminence luminenceHigh High value for luminence */ binImg = imgpointer->ThresholdHSL(1, 255, 1, 255, 230, 255); //Saves the image to a temp directory binImg->Write("/tmp/thresh.jpg"); //Writes the binary image to disk imaqWriteFile(binImg->GetImaqImage(), "/tmp/thresh2.jpg", NULL); delete imgpointer; Image* Convex = imaqCreateImage(IMAQ_IMAGE_U8, 0); int returnvalue; returnvalue = imaqConvexHull(Convex, binImg->GetImaqImage(), TRUE); // imaqWriteFile(Convex, "/tmp/convex.jpg", NULL); delete binImg; // screen->PrintfLine(DriverStationLCD::kUser_Line4,"convex is %d",returnvalue); screen->UpdateLCD(); float lookuptable[256]; lookuptable[0] = 0; lookuptable[1] = 65535; //Converts image to 16 bit, then back to 8 bit. Image* cast = imaqCreateImage(IMAQ_IMAGE_U16, 0); imaqCast(cast, Convex, IMAQ_IMAGE_U16, lookuptable, 0); imaqDispose(Convex); Image* bitcast = imaqCreateImage(IMAQ_IMAGE_U8, 0); imaqCast(bitcast, cast, IMAQ_IMAGE_U8, NULL, 0); imaqDispose(cast); // screen->PrintfLine(DriverStationLCD::kUser_Line3,"det %d", imaqGetLastError());//Notifies the user imaqWriteFile(bitcast, "/tmp/bitcast.jpg", NULL); //Image* SuperSize = im //imaqCreateImage(IMAQ_IMAGE_U8, 2240); //int returnvalue2; //returnvalue2 = imaqSizeFilter(SuperSize, Convex, TRUE, 1, IMAQ_KEEP_LARGE, NULL); //screen->UpdateLCD(); //imaqDispose (Convex); // ROI *roi; // Rect rectangle; // rectangle.top = 0; // rectangle.left = 0; // rectangle.width = 320; // rectangle.height = 120; // imaqAddRectContour(roi,rectangle); static RectangleDescriptor rectangleDescriptor = { 30, // minWidth (All values are estimated) 200, // maxWidth 20, // minHeight 200 // maxHeight }; static CurveOptions curveOptions = //extraction mode specifies what the VI identifies curves in the image. curve options are all the { IMAQ_NORMAL_IMAGE, // extractionMode 75, // threshold IMAQ_NORMAL, // filterSize 25, // minLength 15, // rowStepSize 15, // columnStepSize 10, // maxEndPointGap FALSE, // onlyClosed FALSE // subpixelAccuracy }; static ShapeDetectionOptions shapeOptions = { IMAQ_GEOMETRIC_MATCH_ROTATION_INVARIANT, // mode NULL, // angle ranges 0, // num angle ranges {75, 125}, // scale range 300 // minMatchScore }; int matches = 0; //double highscore = 0; //int highestindex = -1; float difference = 0; float time = 0; float average = 0; double y = 0; //The big important line of code that does important stuff RectangleMatch* recmatch = imaqDetectRectangles(bitcast, &rectangleDescriptor, &curveOptions, &shapeOptions, NULL, &matches); // DashboardDataSender *dds; // dds = new DashboardDataSender; //screen->PrintfLine(DriverStationLCD::kUser_Line3,"det %d", imaqGetLastError()); //screen->PrintfLine(DriverStationLCD::kUser_Line4,"Matches: %d",matches);//Notifies the user screen->PrintfLine(DriverStationLCD::kUser_Line1,"Matches: %i",matches);//Notifies the user screen->UpdateLCD(); /*for(int i = 0; i < matches; i++) { //screen->PrintfLine((DriverStationLCD::Line)(i+1),"%i,%i,%i",recmatch[i].height,recmatch[i].width,recmatch[i].score); if(recmatch[i].score > highscore) { highscore = recmatch[i].score; highestindex = i; } screen->PrintfLine(DriverStationLCD::kUser_Line1,"score %i, i %i", recmatch[i].score, i); screen->UpdateLCD(); }*/ average = (recmatch->corner[1].x + recmatch->corner[3].x)/2; y = (472/(recmatch->height-4)); screen->PrintfLine(DriverStationLCD::kUser_Line5,"%f",average); screen->PrintfLine(DriverStationLCD::kUser_Line3," %f",distance(recmatch->height)); //screen->PrintfLine(DriverStationLCD::kUser_Line5,"%f,%f",recmatch->height, y); screen->PrintfLine(DriverStationLCD::kUser_Line6,"%f,%f",ceil(recmatch->corner[1].x),ceil(recmatch->corner[3].x)); screen->UpdateLCD(); //screen->PrintfLine(DriverStationLCD::kUser_Line6,"%d, %d, %d, %d",recmatch->corner[1].x,recmatch->corner[2].x,recmatch->corner[3].x,recmatch->corner[4].x); //screen->PrintfLine(DriverStationLCD::kUser_Line5,"%d, %d",recmatch->height,recmatch->width); if(average == 0) { screen->PrintfLine(DriverStationLCD::kUser_Line1,"Image Not Found"); } else if(average < 145) { difference = (160 - average); time = difference*0.0062; vic.Set(0.1); Wait(time); vic.Set(0.0); screen->PrintfLine(DriverStationLCD::kUser_Line1,"Less!"); screen->UpdateLCD(); } else if (average > 175) { difference = (average - 160); time = difference*0.0062; vic.Set(-0.1); Wait(time); vic.Set(0.0); screen->PrintfLine(DriverStationLCD::kUser_Line1,"More!"); screen->UpdateLCD(); } else { vic.Set(0); screen->PrintfLine(DriverStationLCD::kUser_Line1,"Perfection!"); screen->UpdateLCD(); } screen->PrintfLine(DriverStationLCD::kUser_Line2,"Time: %f",time); screen->PrintfLine(DriverStationLCD::kUser_Line4,"difference %f",difference); // screen->PrintfLine(DriverStationLCD::kUser_Line2,"Score %i, Index %i", highscore, highestindex); /* if(matches > 0) { int counter = 0; while (counter < 20) { average = (recmatch[highestindex].corner[1].x + recmatch[highestindex].corner[2].x + recmatch[highestindex].corner[3].x +recmatch[highestindex].corner[4].x)/4; average2 = (recmatch[highestindex].corner[1].y + recmatch[highestindex].corner[2].y + recmatch[highestindex].corner[3].y +recmatch[highestindex].corner[4].y)/4; // screen->PrintfLine(DriverStationLCD::kUser_Line5,"Center = %f, %f",average, average2); screen->UpdateLCD(); if (average > 170) { vic.Set(-0.1); //screen->PrintfLine(DriverStationLCD::kUser_Line1,"Left %f",vic.Get()); //screen->UpdateLCD(); } else if (average < 150) { vic.Set(0.1); //screen->PrintfLine(DriverStationLCD::kUser_Line1,"Right %f",vic.Get()); //screen->UpdateLCD(); } else { counter = 20; vic.Set(0); // screen->PrintfLine(DriverStationLCD::kUser_Line6,"Not Mallory! %f",vic.Get()); screen->UpdateLCD(); } counter++a; } */ // imaqWriteFile(cast, "/tmp/linedetect.jpg", NULL); // } /* else { vic.Set(0); // screen->PrintfLine(DriverStationLCD::kUser_Line6,"Not Mallory! %f",vic.Get()); screen->UpdateLCD(); }*/ imaqDispose(bitcast); imaqDispose(recmatch); //imaqDispose(roi); vic.Set(0); } }