int main (int argc, char** argv) { pcl::PointCloud<pcl::PointXYZ>::Ptr model (new pcl::PointCloud<pcl::PointXYZ>); pcl::PointCloud<pcl::PointXYZ>::Ptr scene (new pcl::PointCloud<pcl::PointXYZ>); pcl::PointCloud<pcl::PointXYZ>::Ptr output (new pcl::PointCloud<pcl::PointXYZ>); // Fill in the CloudIn data pcl::io::loadPCDFile<pcl::PointXYZ> ("../models/arm_segment_last.pcd", *model); std::cout << "Model " << model->points.size () << " points." << std::endl; pcl::io::loadPCDFile<pcl::PointXYZ> ("../queries/arm_segment_last_query1.pcd", *scene); std::cout << "Query " << scene->points.size () << " points." << std::endl; Eigen::Matrix4f final_transform; pairAlign (model, scene, output, final_transform); }
void FastPairwiseAlign::pairwiseAlign(Alignment *alignPtr, DistMatrix *distMat, int iStart, int iEnd, int jStart, int jEnd) { try { if(distMat->getSize() != alignPtr->getNumSeqs() + 1) { cerr << "The distance matrix is not the right size!\n" << "Need to terminate program.\n"; exit(1); } if((iStart < 0) || (iEnd < iStart) || (jStart < 0) || (jEnd < jStart)) { cout << "The range for pairwise Alignment is incorrect.\n" << "Need to terminate program.\n"; exit(1); } int i, j, dsr; double calcScore; bool _DNAFlag = userParameters->getDNAFlag(); _maxAlnLength = alignPtr->getMaxAlnLength(); int num = (2 * _maxAlnLength) + 1; accum.ResizeRect(5, num); displ.resize(num); slopes.resize(num); diagIndex.resize(num); zza.resize(_maxAlnLength + 1); zzb.resize(_maxAlnLength + 1); zzc.resize(_maxAlnLength + 1); zzd.resize(_maxAlnLength + 1); if (_DNAFlag) { userParameters->setDNAParams(); } else { userParameters->setProtParams(); } cout << "\n\n"; for (i = iStart + 1; i <= iEnd; ++i) { const vector<int>* _seqIPtr = alignPtr->getSequence(i); int _seqILength = alignPtr->getSeqLength(i); if (_DNAFlag) { makeNPtrs(zza, zzc, _seqIPtr, _seqILength); } else { makePPtrs(zza, zzc, _seqIPtr, _seqILength); } double _score; for (j = jStart + 2 > i+1 ? jStart + 2 : i+1; j <= jEnd; ++j) { const vector<int>* _seqJPtr = alignPtr->getSequence(j); int _seqJLength = alignPtr->getSeqLength(j); if (_DNAFlag) { makeNPtrs(zzb, zzd, _seqJPtr, _seqJLength); } else { makePPtrs(zzb, zzd, _seqJPtr, _seqJLength); } pairAlign(_seqIPtr, _seqILength, _seqJLength); if (!maxSoFar) { calcScore = 0.0; } else { calcScore = (double)accum[0][maxSoFar]; if (userParameters->getPercent()) { dsr = (_seqILength < _seqJLength) ? _seqILength : _seqJLength; calcScore = (calcScore / (double)dsr) *100.0; } } _score = (100.0 - calcScore) / 100.0; distMat->SetAt(i, j, _score); //distMat->SetAt(j, i, _score); /* distMat symmetric, FS, 2009-04-06 */ if(userParameters->getDisplayInfo()) { if (calcScore > 0.1) { utilityObject->info("Sequences (%d:%d) Aligned. Score: %lg", i, j, calcScore); } else { utilityObject->info("Sequences (%d:%d) Not Aligned", i, j); } } } } accum.clearArray(); displ.clear(); slopes.clear(); diagIndex.clear(); zza.clear(); zzb.clear(); zzc.clear(); zzd.clear(); } catch(const exception& e) { cerr << "An exception has occured in the FastPairwiseAlign class.\n" << e.what() << "\n"; exit(1); } }