mirror of
https://github.com/opencv/opencv.git
synced 2025-08-06 06:26:29 +08:00
Fix Transposed eigenvals and vecs. Didn't notice at first
This commit is contained in:
parent
0136711cf4
commit
800da724a3
@ -544,15 +544,15 @@ cv::RotatedRect cv::fitEllipseAMS( InputArray _points )
|
|||||||
// Select the eigen vector {a,b,c,d,e} which has the lowest eigenvalue
|
// Select the eigen vector {a,b,c,d,e} which has the lowest eigenvalue
|
||||||
int minpos = 0;
|
int minpos = 0;
|
||||||
double normi, normEVali, normMinpos, normEValMinpos;
|
double normi, normEVali, normMinpos, normEValMinpos;
|
||||||
normMinpos = sqrt(eVec.at<double>(0,minpos)*eVec.at<double>(0,minpos) + eVec.at<double>(1,minpos)*eVec.at<double>(1,minpos) + \
|
normMinpos = sqrt(eVec.at<double>(minpos,0)*eVec.at<double>(minpos,0) + eVec.at<double>(minpos,1)*eVec.at<double>(minpos,1) + \
|
||||||
eVec.at<double>(2,minpos)*eVec.at<double>(2,minpos) + eVec.at<double>(3,minpos)*eVec.at<double>(3,minpos) + \
|
eVec.at<double>(minpos,2)*eVec.at<double>(minpos,2) + eVec.at<double>(minpos,3)*eVec.at<double>(minpos,3) + \
|
||||||
eVec.at<double>(4,minpos)*eVec.at<double>(4,minpos) );
|
eVec.at<double>(minpos,4)*eVec.at<double>(minpos,4) );
|
||||||
normEValMinpos = eVal.at<double>(0,minpos) * normMinpos;
|
normEValMinpos = eVal.at<double>(minpos,0) * normMinpos;
|
||||||
for (i=1; i<5; i++) {
|
for (i=1; i<5; i++) {
|
||||||
normi = sqrt(eVec.at<double>(0,i)*eVec.at<double>(0,i) + eVec.at<double>(1,i)*eVec.at<double>(1,i) + \
|
normi = sqrt(eVec.at<double>(i,0)*eVec.at<double>(i,0) + eVec.at<double>(i,1)*eVec.at<double>(i,1) + \
|
||||||
eVec.at<double>(2,i)*eVec.at<double>(2,i) + eVec.at<double>(3,i)*eVec.at<double>(3,i) + \
|
eVec.at<double>(i,2)*eVec.at<double>(i,2) + eVec.at<double>(i,3)*eVec.at<double>(i,3) + \
|
||||||
eVec.at<double>(4,i)*eVec.at<double>(4,i) );
|
eVec.at<double>(i,4)*eVec.at<double>(i,4) );
|
||||||
normEVali = eVal.at<double>(0,i) * normi;
|
normEVali = eVal.at<double>(i,0) * normi;
|
||||||
if (normEVali < normEValMinpos) {
|
if (normEVali < normEValMinpos) {
|
||||||
minpos = i;
|
minpos = i;
|
||||||
normMinpos=normi;
|
normMinpos=normi;
|
||||||
@ -560,11 +560,11 @@ cv::RotatedRect cv::fitEllipseAMS( InputArray _points )
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
pVec(0) =eVec.at<double>(0,minpos) / normMinpos;
|
pVec(0) =eVec.at<double>(minpos,0) / normMinpos;
|
||||||
pVec(1) =eVec.at<double>(1,minpos) / normMinpos;
|
pVec(1) =eVec.at<double>(minpos,1) / normMinpos;
|
||||||
pVec(2) =eVec.at<double>(2,minpos) / normMinpos;
|
pVec(2) =eVec.at<double>(minpos,2) / normMinpos;
|
||||||
pVec(3) =eVec.at<double>(3,minpos) / normMinpos;
|
pVec(3) =eVec.at<double>(minpos,3) / normMinpos;
|
||||||
pVec(4) =eVec.at<double>(4,minpos) / normMinpos;
|
pVec(4) =eVec.at<double>(minpos,4) / normMinpos;
|
||||||
|
|
||||||
coeffs(0) =pVec(0) ;
|
coeffs(0) =pVec(0) ;
|
||||||
coeffs(1) =pVec(1) ;
|
coeffs(1) =pVec(1) ;
|
||||||
@ -715,19 +715,19 @@ cv::RotatedRect cv::fitEllipseDirect( InputArray _points )
|
|||||||
|
|
||||||
// Select the eigen vector {a,b,c} which satisfies 4ac-b^2 > 0
|
// Select the eigen vector {a,b,c} which satisfies 4ac-b^2 > 0
|
||||||
double cond[3];
|
double cond[3];
|
||||||
cond[0]=(4.0 * eVec.at<double>(0,0) * eVec.at<double>(2,0) - eVec.at<double>(1,0) * eVec.at<double>(1,0));
|
cond[0]=(4.0 * eVec.at<double>(0,0) * eVec.at<double>(0,2) - eVec.at<double>(0,1) * eVec.at<double>(0,1));
|
||||||
cond[1]=(4.0 * eVec.at<double>(0,1) * eVec.at<double>(2,1) - eVec.at<double>(1,1) * eVec.at<double>(1,1));
|
cond[1]=(4.0 * eVec.at<double>(1,0) * eVec.at<double>(1,2) - eVec.at<double>(1,1) * eVec.at<double>(1,1));
|
||||||
cond[2]=(4.0 * eVec.at<double>(0,2) * eVec.at<double>(2,2) - eVec.at<double>(1,2) * eVec.at<double>(1,2));
|
cond[2]=(4.0 * eVec.at<double>(2,0) * eVec.at<double>(2,2) - eVec.at<double>(2,1) * eVec.at<double>(2,1));
|
||||||
if (cond[0]<cond[1]) {
|
if (cond[0]<cond[1]) {
|
||||||
i = (cond[1]<cond[2]) ? 2 : 1;
|
i = (cond[1]<cond[2]) ? 2 : 1;
|
||||||
} else {
|
} else {
|
||||||
i = (cond[0]<cond[2]) ? 2 : 0;
|
i = (cond[0]<cond[2]) ? 2 : 0;
|
||||||
}
|
}
|
||||||
double norm = std::sqrt(eVec.at<double>(0,i)*eVec.at<double>(0,i) + eVec.at<double>(1,i)*eVec.at<double>(1,i) + eVec.at<double>(2,i)*eVec.at<double>(2,i));
|
double norm = std::sqrt(eVec.at<double>(i,0)*eVec.at<double>(i,0) + eVec.at<double>(i,1)*eVec.at<double>(i,1) + eVec.at<double>(i,2)*eVec.at<double>(i,2));
|
||||||
if (((eVec.at<double>(0,i)<0.0 ? -1 : 1) * (eVec.at<double>(1,i)<0.0 ? -1 : 1) * (eVec.at<double>(2,i)<0.0 ? -1 : 1)) <= 0.0) {
|
if (((eVec.at<double>(i,0)<0.0 ? -1 : 1) * (eVec.at<double>(i,1)<0.0 ? -1 : 1) * (eVec.at<double>(i,2)<0.0 ? -1 : 1)) <= 0.0) {
|
||||||
norm=-1.0*norm;
|
norm=-1.0*norm;
|
||||||
}
|
}
|
||||||
pVec(0) =eVec.at<double>(0,i)/norm; pVec(1) =eVec.at<double>(1,i)/norm;pVec(2) =eVec.at<double>(2,i)/norm;
|
pVec(0) =eVec.at<double>(i,0)/norm; pVec(1) =eVec.at<double>(i,1)/norm;pVec(2) =eVec.at<double>(i,2)/norm;
|
||||||
|
|
||||||
// Q = (TM . pVec)/Ts;
|
// Q = (TM . pVec)/Ts;
|
||||||
Q(0,0) = (TM(0,0)*pVec(0) +TM(0,1)*pVec(1) +TM(0,2)*pVec(2) )/Ts;
|
Q(0,0) = (TM(0,0)*pVec(0) +TM(0,1)*pVec(1) +TM(0,2)*pVec(2) )/Ts;
|
||||||
|
@ -282,15 +282,21 @@ void processImage(int /*h*/, void*)
|
|||||||
}
|
}
|
||||||
if (fitEllipseQ) {
|
if (fitEllipseQ) {
|
||||||
box = fitEllipse(pts);
|
box = fitEllipse(pts);
|
||||||
if( MAX(box.size.width, box.size.height) > MIN(box.size.width, box.size.height)*30 ){continue;};
|
if( MAX(box.size.width, box.size.height) > MIN(box.size.width, box.size.height)*30 ||
|
||||||
|
MAX(box.size.width, box.size.height) <= 0 ||
|
||||||
|
MIN(box.size.width, box.size.height) <= 0){continue;};
|
||||||
}
|
}
|
||||||
if (fitEllipseAMSQ) {
|
if (fitEllipseAMSQ) {
|
||||||
boxAMS = fitEllipseAMS(pts);
|
boxAMS = fitEllipseAMS(pts);
|
||||||
if( MAX(boxAMS.size.width, boxAMS.size.height) > MIN(boxAMS.size.width, boxAMS.size.height)*30 ){continue;};
|
if( MAX(boxAMS.size.width, boxAMS.size.height) > MIN(boxAMS.size.width, boxAMS.size.height)*30 ||
|
||||||
|
MAX(box.size.width, box.size.height) <= 0 ||
|
||||||
|
MIN(box.size.width, box.size.height) <= 0){continue;};
|
||||||
}
|
}
|
||||||
if (fitEllipseDirectQ) {
|
if (fitEllipseDirectQ) {
|
||||||
boxDirect = fitEllipseDirect(pts);
|
boxDirect = fitEllipseDirect(pts);
|
||||||
if( MAX(boxDirect.size.width, boxDirect.size.height) > MIN(boxDirect.size.width, boxDirect.size.height)*30 ){continue;};
|
if( MAX(boxDirect.size.width, boxDirect.size.height) > MIN(boxDirect.size.width, boxDirect.size.height)*30 ||
|
||||||
|
MAX(box.size.width, box.size.height) <= 0 ||
|
||||||
|
MIN(box.size.width, box.size.height) <= 0 ){continue;};
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fitEllipseQ) {
|
if (fitEllipseQ) {
|
||||||
|
Loading…
Reference in New Issue
Block a user