reprojection error를 계산하는 작은 프로그램
2976 단어 float
double reprojectionErrorCalculation(IplImage *rgbImage, CvMat *objectPoints, CvMat *imagePoints, CvMat *calibrationMatrix, CvMat *rotationMatrix, CvMat *translationVector){
IplImage* img=cvCreateImage(cvSize(rgbImage->width,rgbImage->height),rgbImage->depth,rgbImage->nChannels);
cvCopy(rgbImage,img);
int numPoints=objectPoints->height;
CvMat* translationMatrix=cvCreateMat(3,numPoints,CV_32FC1);
for(int i=0;i<3;i++){
float* ptr=(float*)(translationMatrix->data.ptr+i*translationMatrix->step);
float* ptrTranslation=(float*)(translationVector->data.ptr+i*translationVector->step);
for(int j=0;j<numPoints;j++){
*(ptr+j)=*ptrTranslation;
}
}
CvMat* objectPointsTranspose=cvCreateMat(3,numPoints,CV_32FC1);
cvTranspose(objectPoints,objectPointsTranspose);
CvMat* imagePointsHomogeneous=cvCreateMat(3,numPoints,CV_32FC1);
cvMatMulAdd(rotationMatrix,objectPointsTranspose,translationMatrix,imagePointsHomogeneous);
cvMatMul(calibrationMatrix,imagePointsHomogeneous,imagePointsHomogeneous);
CvMat* imagePointsReproject=cvCreateMat(numPoints,2,CV_32FC1);
cvConvertPointsHomogeneous(imagePointsHomogeneous,imagePointsReproject);
CvMat* reprojectionErrorMatrix=cvCreateMat(numPoints,2,CV_32FC1);
cvSub(imagePoints,imagePointsReproject,reprojectionErrorMatrix);
cvPow(reprojectionErrorMatrix,reprojectionErrorMatrix,2.0);
CvScalar reprojectionError=cvSum(reprojectionErrorMatrix);
reprojectionError.val[0]=sqrt(reprojectionError.val[0]/numPoints);
printf("The reprojection error is:\t%lf
",reprojectionError.val[0]);
for(int i=0;i<numPoints;i++){
float* ptrOriginal=(float*)(imagePoints->data.ptr+i*imagePoints->step);
float* ptrReproject=(float*)(imagePointsReproject->data.ptr+i*imagePointsReproject->step);
cvLine(img,cvPoint(*(ptrOriginal)-3.0,*(ptrOriginal+1)),cvPoint(*(ptrOriginal)+3.0,*(ptrOriginal+1)),CV_RGB(255.0,0.0,0.0));
cvLine(img,cvPoint(*(ptrOriginal),*(ptrOriginal+1)-3.0),cvPoint(*(ptrOriginal),*(ptrOriginal+1)+3.0),CV_RGB(255.0,0.0,0.0));
cvLine(img,cvPoint(*(ptrReproject)-3.0,*(ptrReproject+1)),cvPoint(*(ptrReproject)+3.0,*(ptrReproject+1)),CV_RGB(0.0,255.0,0.0));
cvLine(img,cvPoint(*(ptrReproject),*(ptrReproject+1)-3.0),cvPoint(*(ptrReproject),*(ptrReproject+1)+3.0),CV_RGB(0.0,255.0,0.0));
}
cvNamedWindow("reprojection error");
cvShowImage("reprojection error",img);
while(1){
if(cvWaitKey(2)==27)
break;
}
cvDestroyWindow("reprojection error");
cvReleaseImage(&img);
cvReleaseMat(&translationMatrix);
cvReleaseMat(&objectPointsTranspose);
cvReleaseMat(&imagePointsHomogeneous);
cvReleaseMat(&imagePointsReproject);
cvReleaseMat(&reprojectionErrorMatrix);
return reprojectionError.val[0];
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Float 계산 회로의 Verilog-HDL 구현에 대해 - 그 2.7 (0 대응)~ FPGA에 올리고 싶다 ~ 올레올레 구현이므로 잘못되어도 몰라요 가산회로편 디버그 툴 작성편 보충과 LeadingZeros편 감산회로편 회로 공통화와 타이밍 조정편 공통화편 float 공부 float32의 하드웨...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.