void Horus::getPCA(const vector<cv::Point> &contour, float ¢er, float &angle) { //Construct a buffer used by the pca analysis int sz = static_cast<int>(contour.size()); Mat data_pts = Mat(sz, 2, CV_32FC1); for (int i = 0; i < data_pts.rows; ++i) { data_pts.at<float>(i, 0) = contour[i].x; data_pts.at<float>(i, 1) = contour[i].y; } //Perform PCA analysis PCA pca_analysis(data_pts, Mat(), CV_PCA_DATA_AS_ROW); //Store the center of the object cv::Point cntr = cv::Point(static_cast<int>(pca_analysis.mean.at<float>(0, 0)), static_cast<int>(pca_analysis.mean.at<float>(0, 1))); //Store the eigenvalues and eigenvectors vector<cv::Point2d> eigen_vecs(2); vector<float> eigen_val(2); for (int i = 0; i < 2; ++i) { eigen_vecs[i] = Point2d(pca_analysis.eigenvectors.at<float>(i, 0), pca_analysis.eigenvectors.at<float>(i, 1)); eigen_val[i] = pca_analysis.eigenvalues.at<float>(0, i); } angle = atan2(eigen_vecs[0].y, eigen_vecs[0].x); // orientation in radians }
double HandDetector::GetOrientation(const vector<Point> &pts, Mat &img) { if (pts.size() == 0) return false; //Construct a buffer used by the pca analysis Mat data_pts = Mat(pts.size(), 2, CV_64FC1); for (int i = 0; i < data_pts.rows; ++i) { data_pts.at<double>(i, 0) = pts[i].x; data_pts.at<double>(i, 1) = pts[i].y; } //Perform PCA analysis PCA pca_analysis(data_pts, Mat(), CV_PCA_DATA_AS_ROW); //Store the position of the object Point pos = Point(pca_analysis.mean.at<double>(0, 0), pca_analysis.mean.at<double>(0, 1)); //Store the eigenvalues and eigenvectors vector<Point2d> eigen_vecs(2); vector<double> eigen_val(2); for (int i = 0; i < 2; ++i) { eigen_vecs[i] = Point2d(pca_analysis.eigenvectors.at<double>(i, 0), pca_analysis.eigenvectors.at<double>(i, 1)); eigen_val[i] = pca_analysis.eigenvalues.at<double>(i); } // Draw the principal components circle(img, pos, 3, CV_RGB(255, 0, 255), 2); //line(img, pos, pos + 0.02 * Point(eigen_vecs[0].x * eigen_val[0], eigen_vecs[0].y * eigen_val[0]) , CV_RGB(255, 255, 0)); //line(img, pos, pos + 0.02 * Point(eigen_vecs[1].x * eigen_val[1], eigen_vecs[1].y * eigen_val[1]) , CV_RGB(0, 255, 255)); Point p1 = pos + 0.02 * Point(eigen_vecs[0].x * eigen_val[0], eigen_vecs[0].y * eigen_val[0]); Point p2 = pos + 0.02 * Point(eigen_vecs[1].x * eigen_val[1], eigen_vecs[1].y * eigen_val[1]); DrawAxis(img, pos, p1, Scalar(0, 255, 0), 1); DrawAxis(img, pos, p2, Scalar(255, 255, 0), 5); return atan2(eigen_vecs[0].y, eigen_vecs[0].x)*(180/CV_PI); }
// Calculate the angle in degrees of a certain line. double NaoVision::getAngleDegrees(const vector<Point> &pts, Mat &img) { // Construct a buffer used by the pca analysis. int sz = static_cast<int>(pts.size()); Mat data_pts = Mat(sz, 2, CV_64FC1); for(int i = 0; i < data_pts.rows; ++i) { data_pts.at<double>(i, 0) = pts[i].x; data_pts.at<double>(i, 1) = pts[i].y; } // Perform PCA analysis. PCA pca_analysis(data_pts, Mat(), CV_PCA_DATA_AS_ROW); // Store the center of the object. Point cntr = Point(static_cast<int>(pca_analysis.mean.at<double>(0, 0)), static_cast<int>(pca_analysis.mean.at<double>(0, 1))); // Store the eigenvalues and eigenvectors. vector<Point2d> eigen_vecs(2); vector<double> eigen_val(2); for(int i = 0; i < 2; ++i) { eigen_vecs[i] = Point2d(pca_analysis.eigenvectors.at<double>(i, 0), pca_analysis.eigenvectors.at<double>(i, 1)); eigen_val[i] = pca_analysis.eigenvalues.at<double>(0, i); } // Draw the principal components. circle(img, cntr, 3, Scalar(255, 0, 255), 2); Point p1 = cntr + 0.02 * Point(static_cast<int>(eigen_vecs[0].x * eigen_val[0]), static_cast<int>(eigen_vecs[0].y * eigen_val[0])); Point p2 = cntr - 0.02 * Point(static_cast<int>(eigen_vecs[1].x * eigen_val[1]), static_cast<int>(eigen_vecs[1].y * eigen_val[1])); drawAxis(img, cntr, p1, Scalar(0, 255, 0), 1); drawAxis(img, cntr, p2, Scalar(255, 255, 0), 5); double angle = atan2(eigen_vecs[0].y, eigen_vecs[0].x); // Angle in radians. double degrees = angle * 180 / CV_PI; // Convert radians to degrees (0-180 range). degrees = degrees < 0 ? degrees + 180 : degrees; return degrees; }
double Segmentation::getOrientation(std::vector<cv::Point> &pts, cv::Mat &img) { if (pts.size() == 0) return false; //Construct a buffer used by the pca analysis cv::Mat data_pts = cv::Mat(pts.size(), 2, CV_64FC1); for (int i = 0; i < data_pts.rows; ++i) { data_pts.at<double>(i, 0) = pts[i].x; data_pts.at<double>(i, 1) = pts[i].y; } //Perform PCA analysis cv::PCA pca_analysis(data_pts, cv::Mat(), CV_PCA_DATA_AS_ROW); //Store the position of the object cv::Point2i pos = cv::Point2i(static_cast<int>(pca_analysis.mean.at<double>(0, 0)), static_cast<int>(pca_analysis.mean.at<double>(0, 1))); //Store the eigenvalues and eigenvectors std::vector<cv::Point2d> eigen_vecs(2); std::vector<double> eigen_val(2); for (int i = 0; i < 2; ++i) { eigen_vecs[i] = cv::Point2d(pca_analysis.eigenvectors.at<double>(i, 0), pca_analysis.eigenvectors.at<double>(i, 1)); eigen_val[i] = pca_analysis.eigenvalues.at<double>(0, i); } // Draw the principal components cv::circle(img, pos, 3, CV_RGB(255, 0, 255), 2); cv::line(img, pos, pos + 0.02 * cv::Point(static_cast<int>(eigen_vecs[0].x * eigen_val[0]),static_cast<int> (eigen_vecs[0].y * eigen_val[0])) , CV_RGB(255, 255, 0)); cv::line(img, pos, pos + 0.02 * cv::Point(static_cast<int>(eigen_vecs[1].x * eigen_val[1]), static_cast<int>(eigen_vecs[1].y * eigen_val[1])) , CV_RGB(0, 255, 255)); return atan2(eigen_vecs[0].y, eigen_vecs[0].x); }
void Projector::objProjectionOffline(std::string objPath, std::string objName, bool gpuView) { std::cout << "Camera init: "; objObject obj(objPath, objName); obj.loadData(); cout << "DONE\n"; cv::namedWindow("objTest", CV_WINDOW_NORMAL); cv::moveWindow("objTest", 0, 0); indices.resize(480); for (int i = 0; i < 480; i++) indices[i].resize(640); libfreenect2::Registration* registration = new libfreenect2::Registration(_dev->getIrCameraParams(), _dev->getColorCameraParams()); libfreenect2::Frame undistorted(512, 424, 4), registered(512, 424, 4); libfreenect2::FrameMap frames; SimpleViewer viewer; bool shutdown = false; cv::Mat board(480, 640, CV_8UC4, cv::Scalar::all(255)); cv::Vec3f prevNormal(-1, -1, -1); if (!gpuView) { cv::namedWindow("reprojection", CV_WINDOW_NORMAL); cv::moveWindow("reprojection", 200, 200); //setWindowProperty("reprojection", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN); } else { viewer.setSize(480, 640); // TO-DO change resolution viewer.initialize(); libfreenect2::Frame b(640, 480, 4); b.data = board.data; viewer.addFrame("RGB", &b); shutdown = shutdown || viewer.render(); } while (!shutdown) { board = cv::Mat(480, 640, CV_8UC4, cv::Scalar::all(255)); std::vector<cv::Point3f> plnSrc; if (!gpuView) cv::imshow("reprojection", board); (_listener)->waitForNewFrame(frames); libfreenect2::Frame *rgb = frames[libfreenect2::Frame::Color]; libfreenect2::Frame *depth = frames[libfreenect2::Frame::Depth]; registration->apply(rgb, depth, &undistorted, ®istered, true, NULL, NULL); PlaneData pln = findRectangle(registration, &undistorted, ®istered); if (pln.points.size() > 0) { std::vector<cv::Point2f> projected = projectPoints(pln.points); cv::Mat cont = cv::Mat(480, 640, CV_8UC1, cv::Scalar::all(0)); for (int i = 0; i < projected.size(); i++) { if (480 - projected[i].x >0 && projected[i].y > 0 && 480 - projected[i].x < 475 && projected[i].y < 630) { cv::Mat ROI = board(cv::Rect(static_cast<int>(projected[i].y), static_cast<int>(480 - projected[i].x), 2, 2)); ROI.setTo(cv::Scalar(250, 100, 100, 100)); cont.at<uchar>(static_cast<int>(480 - projected[i].x), static_cast<int>(projected[i].y), 0) = 255; plnSrc.push_back(pln.points[i]); } } vector<vector<cv::Point> > contours; vector<cv::Vec4i> hierarchy; cv::GaussianBlur(cont, cont, cv::Size(7, 7), 5, 11); findContours(cont, contours, hierarchy, cv::RETR_CCOMP, cv::CHAIN_APPROX_NONE, cv::Point(0, 0)); vector<vector<cv::Point> > contours_poly(contours.size()); vector<cv::Rect> boundRect(contours.size()); vector<cv::Point2f>center(contours.size()); vector<float>radius(contours.size()); for (int i = 0; i < contours.size(); i++) { cv::approxPolyDP(cv::Mat(contours[i]), contours_poly[i], 10, true); } for (int i = 0; i < contours.size(); i++) { drawContours(board, contours_poly, 0, cv::Scalar(0, 255, 0), 5); } cv::Mat data_pts = cv::Mat(300, 3, CV_64FC1); cv::Vec3f normal(0, 0, 0); int jump = plnSrc.size() / 300; for (int i = 0; i < 100; i++) { data_pts.at<double>(i, 0) = plnSrc[i*jump].x; data_pts.at<double>(i, 1) = plnSrc[i*jump].y; data_pts.at<double>(i, 2) = plnSrc[i*jump].z; data_pts.at<double>(i + 100, 0) = plnSrc[(i + 100)*jump].x; data_pts.at<double>(i + 100, 1) = plnSrc[(i + 100)*jump].y; data_pts.at<double>(i + 100, 2) = plnSrc[(i + 100)*jump].z; data_pts.at<double>(i + 200, 0) = plnSrc[(i + 200) *jump].x; data_pts.at<double>(i + 200, 1) = plnSrc[(i + 200)*jump].y; data_pts.at<double>(i + 200, 2) = plnSrc[(i + 200)*jump].z; } cv::PCA pca_analysis(data_pts, cv::Mat(), CV_PCA_DATA_AS_ROW); cv::Vec3f cntr = cv::Vec3f((pca_analysis.mean.at<double>(0, 0)), (pca_analysis.mean.at<double>(0, 1)), (pca_analysis.mean.at<double>(0, 2))); vector<cv::Point3f> eigen_vecs(2); vector<double> eigen_val(2); for (int i = 0; i < 2; ++i) { eigen_vecs[i] = cv::Point3f(pca_analysis.eigenvectors.at<double>(i, 0), pca_analysis.eigenvectors.at<double>(i, 1), pca_analysis.eigenvectors.at<double>(i, 2)); eigen_val[i] = pca_analysis.eigenvalues.at<double>(0, i); } cv::Vec3f p1 = cv::Vec3f((eigen_vecs[0].x * eigen_val[0]), (eigen_vecs[0].y * eigen_val[0]), (eigen_vecs[0].z * eigen_val[0])); cv::Vec3f p2 = cv::Vec3f((eigen_vecs[1].x * eigen_val[1]), (eigen_vecs[1].y * eigen_val[1]), (eigen_vecs[1].z * eigen_val[1])); normal = p1.cross(p2); normal = cv::normalize(normal); //pln.center = cntr; pln.normal = normal; obj.setCamera(cv::Point3f(pln.center.x, -pln.center.y, -pln.center.z + 150), cv::Vec3f(pln.normal[0], pln.normal[1], pln.normal[2])); if (!gpuView) imshow("reprojection", board); else { libfreenect2::Frame b(640, 480, 4); b.data = board.data; viewer.addFrame("RGB", &b); shutdown = shutdown || viewer.render(); } } cv::Mat im = obj.render(); cv::imshow("objTest", im); //} (_listener)->release(frames); if (!gpuView) { int op = cv::waitKey(50); if (op == 100 || (char)(op) == 'd') right -= 1; if (op == 115 || (char)(op) == 's') up += 1; if (op == 97 || (char)(op) == 'a') right += 1; if (op == 119 || (char)(op) == 'w') up -= 1; if (op == 114 || (char)(op) == 'r') rotX -= 0.5; if (op == 102 || (char)(op) == 'f') rotX += 0.5; if (op == 1113997 || op == 1048586 || op == 1048608 || op == 10 || op == 32) { std::cout << "right = " << right << ";\nup = " << up << ";\nrotX = " << rotX << ";\n"; break; } } else { //right = 0; //up = 0; //rotX = 0; right = viewer.offsetX; up = viewer.offsetY; rotX = viewer.rot; } } if (!gpuView) cv::destroyWindow("reprojection"); else { viewer.stopWindow(); } cv::destroyWindow("objTest"); }
mitk::GIFVolumetricStatistics::FeatureListType mitk::GIFVolumetricStatistics::CalculateFeatures(const Image::Pointer & image, const Image::Pointer &mask) { FeatureListType featureList; if (image->GetDimension() < 3) { return featureList; } AccessByItk_3(image, CalculateVolumeStatistic, mask, featureList, FeatureDescriptionPrefix()); AccessByItk_3(mask, CalculateLargestDiameter, image, featureList, FeatureDescriptionPrefix()); vtkSmartPointer<vtkImageMarchingCubes> mesher = vtkSmartPointer<vtkImageMarchingCubes>::New(); vtkSmartPointer<vtkMassProperties> stats = vtkSmartPointer<vtkMassProperties>::New(); mesher->SetInputData(mask->GetVtkImageData()); mesher->SetValue(0, 0.5); stats->SetInputConnection(mesher->GetOutputPort()); stats->Update(); double pi = vnl_math::pi; double meshVolume = stats->GetVolume(); double meshSurf = stats->GetSurfaceArea(); double pixelVolume = featureList[1].second; double pixelSurface = featureList[3].second; MITK_INFO << "Surface: " << pixelSurface << " Volume: " << pixelVolume; double compactness1 = pixelVolume / (std::sqrt(pi) * std::pow(meshSurf, 2.0 / 3.0)); double compactness1Pixel = pixelVolume / (std::sqrt(pi) * std::pow(pixelSurface, 2.0 / 3.0)); //This is the definition used by Aertz. However, due to 2/3 this feature is not demensionless. Use compactness3 instead. double compactness2 = 36 * pi*pixelVolume*pixelVolume / meshSurf / meshSurf / meshSurf; double compactness2MeshMesh = 36 * pi*meshVolume*meshVolume / meshSurf / meshSurf / meshSurf; double compactness2Pixel = 36 * pi*pixelVolume*pixelVolume / pixelSurface / pixelSurface / pixelSurface; double compactness3 = pixelVolume / (std::sqrt(pi) * std::pow(meshSurf, 3.0 / 2.0)); double compactness3MeshMesh = meshVolume / (std::sqrt(pi) * std::pow(meshSurf, 3.0 / 2.0)); double compactness3Pixel = pixelVolume / (std::sqrt(pi) * std::pow(pixelSurface, 3.0 / 2.0)); double sphericity = std::pow(pi, 1 / 3.0) *std::pow(6 * pixelVolume, 2.0 / 3.0) / meshSurf; double sphericityMesh = std::pow(pi, 1 / 3.0) *std::pow(6 * meshVolume, 2.0 / 3.0) / meshSurf; double sphericityPixel = std::pow(pi, 1 / 3.0) *std::pow(6 * pixelVolume, 2.0 / 3.0) / pixelSurface; double surfaceToVolume = meshSurf / meshVolume; double surfaceToVolumePixel = pixelSurface / pixelVolume; double sphericalDisproportion = meshSurf / 4 / pi / std::pow(3.0 / 4.0 / pi * pixelVolume, 2.0 / 3.0); double sphericalDisproportionMesh = meshSurf / 4 / pi / std::pow(3.0 / 4.0 / pi * meshVolume, 2.0 / 3.0); double sphericalDisproportionPixel = pixelSurface / 4 / pi / std::pow(3.0 / 4.0 / pi * pixelVolume, 2.0 / 3.0); double asphericity = std::pow(1.0/compactness2, (1.0 / 3.0)) - 1; double asphericityMesh = std::pow(1.0 / compactness2MeshMesh, (1.0 / 3.0)) - 1; double asphericityPixel = std::pow(1.0/compactness2Pixel, (1.0 / 3.0)) - 1; //Calculate center of mass shift int xx = mask->GetDimensions()[0]; int yy = mask->GetDimensions()[1]; int zz = mask->GetDimensions()[2]; double xd = mask->GetGeometry()->GetSpacing()[0]; double yd = mask->GetGeometry()->GetSpacing()[1]; double zd = mask->GetGeometry()->GetSpacing()[2]; vtkSmartPointer<vtkDoubleArray> dataset1Arr = vtkSmartPointer<vtkDoubleArray>::New(); vtkSmartPointer<vtkDoubleArray> dataset2Arr = vtkSmartPointer<vtkDoubleArray>::New(); vtkSmartPointer<vtkDoubleArray> dataset3Arr = vtkSmartPointer<vtkDoubleArray>::New(); dataset1Arr->SetNumberOfComponents(1); dataset2Arr->SetNumberOfComponents(1); dataset3Arr->SetNumberOfComponents(1); dataset1Arr->SetName("M1"); dataset2Arr->SetName("M2"); dataset3Arr->SetName("M3"); vtkSmartPointer<vtkDoubleArray> dataset1ArrU = vtkSmartPointer<vtkDoubleArray>::New(); vtkSmartPointer<vtkDoubleArray> dataset2ArrU = vtkSmartPointer<vtkDoubleArray>::New(); vtkSmartPointer<vtkDoubleArray> dataset3ArrU = vtkSmartPointer<vtkDoubleArray>::New(); dataset1ArrU->SetNumberOfComponents(1); dataset2ArrU->SetNumberOfComponents(1); dataset3ArrU->SetNumberOfComponents(1); dataset1ArrU->SetName("M1"); dataset2ArrU->SetName("M2"); dataset3ArrU->SetName("M3"); for (int x = 0; x < xx; x++) { for (int y = 0; y < yy; y++) { for (int z = 0; z < zz; z++) { itk::Image<int,3>::IndexType index; index[0] = x; index[1] = y; index[2] = z; mitk::ScalarType pxImage; mitk::ScalarType pxMask; mitkPixelTypeMultiplex5( mitk::FastSinglePixelAccess, image->GetChannelDescriptor().GetPixelType(), image, image->GetVolumeData(), index, pxImage, 0); mitkPixelTypeMultiplex5( mitk::FastSinglePixelAccess, mask->GetChannelDescriptor().GetPixelType(), mask, mask->GetVolumeData(), index, pxMask, 0); //Check if voxel is contained in segmentation if (pxMask > 0) { dataset1ArrU->InsertNextValue(x*xd); dataset2ArrU->InsertNextValue(y*yd); dataset3ArrU->InsertNextValue(z*zd); if (pxImage == pxImage) { dataset1Arr->InsertNextValue(x*xd); dataset2Arr->InsertNextValue(y*yd); dataset3Arr->InsertNextValue(z*zd); } } } } } vtkSmartPointer<vtkTable> datasetTable = vtkSmartPointer<vtkTable>::New(); datasetTable->AddColumn(dataset1Arr); datasetTable->AddColumn(dataset2Arr); datasetTable->AddColumn(dataset3Arr); vtkSmartPointer<vtkTable> datasetTableU = vtkSmartPointer<vtkTable>::New(); datasetTableU->AddColumn(dataset1ArrU); datasetTableU->AddColumn(dataset2ArrU); datasetTableU->AddColumn(dataset3ArrU); vtkSmartPointer<vtkPCAStatistics> pcaStatistics = vtkSmartPointer<vtkPCAStatistics>::New(); pcaStatistics->SetInputData(vtkStatisticsAlgorithm::INPUT_DATA, datasetTable); pcaStatistics->SetColumnStatus("M1", 1); pcaStatistics->SetColumnStatus("M2", 1); pcaStatistics->SetColumnStatus("M3", 1); pcaStatistics->RequestSelectedColumns(); pcaStatistics->SetDeriveOption(true); pcaStatistics->Update(); vtkSmartPointer<vtkDoubleArray> eigenvalues = vtkSmartPointer<vtkDoubleArray>::New(); pcaStatistics->GetEigenvalues(eigenvalues); pcaStatistics->SetInputData(vtkStatisticsAlgorithm::INPUT_DATA, datasetTableU); pcaStatistics->Update(); vtkSmartPointer<vtkDoubleArray> eigenvaluesU = vtkSmartPointer<vtkDoubleArray>::New(); pcaStatistics->GetEigenvalues(eigenvaluesU); std::vector<double> eigen_val(3); std::vector<double> eigen_valUC(3); eigen_val[2] = eigenvalues->GetValue(0); eigen_val[1] = eigenvalues->GetValue(1); eigen_val[0] = eigenvalues->GetValue(2); eigen_valUC[2] = eigenvaluesU->GetValue(0); eigen_valUC[1] = eigenvaluesU->GetValue(1); eigen_valUC[0] = eigenvaluesU->GetValue(2); double major = 4*sqrt(eigen_val[2]); double minor = 4*sqrt(eigen_val[1]); double least = 4*sqrt(eigen_val[0]); double elongation = (major == 0) ? 0 : sqrt(eigen_val[1] / eigen_val[2]); double flatness = (major == 0) ? 0 : sqrt(eigen_val[0] / eigen_val[2]); double majorUC = 4*sqrt(eigen_valUC[2]); double minorUC = 4*sqrt(eigen_valUC[1]); double leastUC = 4*sqrt(eigen_valUC[0]); double elongationUC = majorUC == 0 ? 0 : sqrt(eigen_valUC[1] / eigen_valUC[2]); double flatnessUC = majorUC == 0 ? 0 : sqrt(eigen_valUC[0] / eigen_valUC[2]); std::string prefix = FeatureDescriptionPrefix(); featureList.push_back(std::make_pair(prefix + "Volume (mesh based)",meshVolume)); featureList.push_back(std::make_pair(prefix + "Surface (mesh based)",meshSurf)); featureList.push_back(std::make_pair(prefix + "Surface to volume ratio (mesh based)",surfaceToVolume)); featureList.push_back(std::make_pair(prefix + "Sphericity (mesh based)",sphericity)); featureList.push_back(std::make_pair(prefix + "Sphericity (mesh, mesh based)", sphericityMesh)); featureList.push_back(std::make_pair(prefix + "Asphericity (mesh based)", asphericity)); featureList.push_back(std::make_pair(prefix + "Asphericity (mesh, mesh based)", asphericityMesh)); featureList.push_back(std::make_pair(prefix + "Compactness 1 (mesh based)", compactness3)); featureList.push_back(std::make_pair(prefix + "Compactness 1 old (mesh based)" ,compactness1)); featureList.push_back(std::make_pair(prefix + "Compactness 2 (mesh based)",compactness2)); featureList.push_back(std::make_pair(prefix + "Compactness 1 (mesh, mesh based)", compactness3MeshMesh)); featureList.push_back(std::make_pair(prefix + "Compactness 2 (mesh, mesh based)", compactness2MeshMesh)); featureList.push_back(std::make_pair(prefix + "Spherical disproportion (mesh based)", sphericalDisproportion)); featureList.push_back(std::make_pair(prefix + "Spherical disproportion (mesh, mesh based)", sphericalDisproportionMesh)); featureList.push_back(std::make_pair(prefix + "Surface to volume ratio (voxel based)", surfaceToVolumePixel)); featureList.push_back(std::make_pair(prefix + "Sphericity (voxel based)", sphericityPixel)); featureList.push_back(std::make_pair(prefix + "Asphericity (voxel based)", asphericityPixel)); featureList.push_back(std::make_pair(prefix + "Compactness 1 (voxel based)", compactness3Pixel)); featureList.push_back(std::make_pair(prefix + "Compactness 1 old (voxel based)", compactness1Pixel)); featureList.push_back(std::make_pair(prefix + "Compactness 2 (voxel based)", compactness2Pixel)); featureList.push_back(std::make_pair(prefix + "Spherical disproportion (voxel based)", sphericalDisproportionPixel)); featureList.push_back(std::make_pair(prefix + "PCA Major axis length",major)); featureList.push_back(std::make_pair(prefix + "PCA Minor axis length",minor)); featureList.push_back(std::make_pair(prefix + "PCA Least axis length",least)); featureList.push_back(std::make_pair(prefix + "PCA Elongation",elongation)); featureList.push_back(std::make_pair(prefix + "PCA Flatness",flatness)); featureList.push_back(std::make_pair(prefix + "PCA Major axis length (uncorrected)", majorUC)); featureList.push_back(std::make_pair(prefix + "PCA Minor axis length (uncorrected)", minorUC)); featureList.push_back(std::make_pair(prefix + "PCA Least axis length (uncorrected)", leastUC)); featureList.push_back(std::make_pair(prefix + "PCA Elongation (uncorrected)", elongationUC)); featureList.push_back(std::make_pair(prefix + "PCA Flatness (uncorrected)", flatnessUC)); return featureList; }