double VisionSubsystem::scoreXEdge(BinaryImage *image, ParticleAnalysisReport *report) { double total = 0; LinearAverages *averages = imaqLinearAverages2(image->GetImaqImage(), IMAQ_COLUMN_AVERAGES, report->boundingRect); for(int i=0; i < (averages->columnCount); i++) { if(xMin[i*(XMINSIZE-1)/averages->columnCount] < averages->columnAverages[i] && averages->columnAverages[i] < xMax[i*(XMAXSIZE-1)/averages->columnCount]) { total++; } } total = 100*total/(averages->columnCount); imaqDispose(averages); return total; }
double VisionSubsystem::scoreYEdge(BinaryImage *image, ParticleAnalysisReport *report) { double total = 0; LinearAverages *averages = imaqLinearAverages2(image->GetImaqImage(), IMAQ_ROW_AVERAGES, report->boundingRect); for(int i=0; i < (averages->rowCount); i++){ if(yMin[i*(YMINSIZE-1)/averages->rowCount] < averages->rowAverages[i] && averages->rowAverages[i] < yMax[i*(YMAXSIZE-1)/averages->rowCount]){ total++; } } total = 100*total/(averages->rowCount); //convert to score 0-100 imaqDispose(averages); //let IMAQ dispose of the averages struct return total; }
double VisionSubsystemV2::scoreYEdge(BinaryImage *image, ParticleAnalysisReport *report) { double total = 0; LinearAverages *averages = imaqLinearAverages2(image->GetImaqImage(), IMAQ_ROW_AVERAGES, report->boundingRect); for(int i=0; i < (averages->rowCount); i++){ if(yMinV2[i*(YMINSIZE-1)/averages->rowCount] < averages->rowAverages[i] && averages->rowAverages[i] < yMaxV2[i*(YMAXSIZE-1)/averages->rowCount]){ total++; } } total = 100*total/(averages->rowCount); //convert to score 0-100 imaqDispose(averages); //let IMAQ dispose of the averages struct #ifndef VISION_DEBUG_PRINTF_ENABLE printf("[VisionSubsystemV2] (scoreYEdge) The score of the Y-edge is %f\n", total); #endif return total; }
double VisionSubsystemV2::scoreXEdge(BinaryImage *image, ParticleAnalysisReport *report) { double total = 0; LinearAverages *averages = imaqLinearAverages2(image->GetImaqImage(), IMAQ_COLUMN_AVERAGES, report->boundingRect); for(int i = 0; i < (averages->columnCount); i++) { if (xMinV2[i*(XMINSIZE - 1) / averages->columnCount] < averages->columnAverages[i] && averages->columnAverages[i] < xMaxV2[i*(XMAXSIZE - 1) / averages->columnCount]) { total++; } } total = 100*total/(averages->columnCount); imaqDispose(averages); #ifndef VISION_DEBUG_PRINTF_ENABLE printf("[VisionSubsystemV2] (scoreXEdge) The score of the X-edge is %f\n", total); #endif return total; }
/** * Computes a score based on the match between a template profile and the particle profile in the X direction. This method uses the * the column averages and the profile defined at the top of the sample to look for the solid vertical edges with * a hollow center. * * @param image The image to use, should be the image before the convex hull is performed * @param report The Particle Analysis Report for the particle * * @return The X Edge Score (0-100) */ double TargetReport::scoreXEdge(BinaryImage *image, ParticleAnalysisReport *report){ double total = 0; const double xMax[XMAXSIZE] = {1.0, 1.0, 1.0, 1.0, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.0, 1.0, 1.0, 1.0}; const double xMin[XMINSIZE] = {0.4, 0.6, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.6, 0.0}; LinearAverages *averages = imaqLinearAverages2(image->GetImaqImage(), IMAQ_COLUMN_AVERAGES, report->boundingRect); for(int i=0; i < (averages->columnCount); i++){ if(xMin[i*(XMINSIZE-1)/averages->columnCount] < averages->columnAverages[i] && averages->columnAverages[i] < xMax[i*(XMAXSIZE-1)/averages->columnCount]){ total++; } } total = 100*total/(averages->columnCount); //convert to score 0-100 imaqDispose(averages); //let IMAQ dispose of the averages struct return total; }