अति निर्धारित समीकरणों की प्रणाली के लिए एफ़िन ट्रांसफॉर्म खोजने के लिए एक आसान समाधान है।
- नोट सामान्य रूप में एक Affine परिणत कि एक छद्म उलटा या इसी तरह की तकनीक का उपयोग करके रेखीय समीकरण कुल्हाड़ी = बी के ओवर-द निर्धारित प्रणाली के लिए एक समाधान पाता है, तो
एक्स = (ए.ए. टी) -1 एक टी बी
इसके अलावा, यह एक सरल कॉल द्वारा कोर openCV कार्यक्षमता में नियंत्रित किया जाता है हल करने के लिए (ए, बी, एक्स)।
Affine के कोड को अच्छी तरह समझ opencv/मॉड्यूल/imgproc/src/imgwarp.cpp में परिणत:
एक: यह वास्तव में सिर्फ दो काम करता है। सिस्टम एएक्स = बी बनाने के लिए इनपुट पुनर्व्यवस्थित करता है;
बी। फिर कॉल (ए, बी, एक्स) हल;
नोट: उपेक्षा openCV कोड में समारोह टिप्पणियां - वे भ्रमित कर रहे हैं और मैट्रिक्स में तत्वों की वास्तविक आदेश प्रतिबिंबित नहीं करते। आप को सुलझाने रहे हैं, तो [u, v] '= Affine * [एक्स, वाई, 1] पुनर्व्यवस्था है:
x1 y1 1 0 0 1
0 0 0 x1 y1 1
x2 y2 1 0 0 1
A = 0 0 0 x2 y2 1
x3 y3 1 0 0 1
0 0 0 x3 y3 1
X = [Affine11, Affine12, Affine13, Affine21, Affine22, Affine23]’
u1 v1
B = u2 v2
u3 v3
तुम सब करने की ज़रूरत है अधिक अंक जोड़ना है। हल करने के लिए (ए, बी, एक्स) ओवर-निर्धारित सिस्टम पर काम करने के लिए DECOMP_SVD पैरामीटर जोड़ें। विषय पर पावरपॉइंट स्लाइड्स देखने के लिए, इस link का उपयोग करें। आप कंप्यूटर दृष्टि के संदर्भ में छद्म प्रतिलोम के बारे में अधिक जानने के लिए चाहते हैं, तो सबसे अच्छा स्रोत है: ComputerVision, देखने के अध्याय 15 और परिशिष्ट सी
आप अभी भी अधिक अंक देखने को जोड़ने का तरीका अनिश्चित हैं, तो मेरी नीचे दिए गए कोड:
// extension for n points;
cv::Mat getAffineTransformOverdetermined(const Point2f src[], const Point2f dst[], int n)
{
Mat M(2, 3, CV_64F), X(6, 1, CV_64F, M.data); // output
double* a = (double*)malloc(12*n*sizeof(double));
double* b = (double*)malloc(2*n*sizeof(double));
Mat A(2*n, 6, CV_64F, a), B(2*n, 1, CV_64F, b); // input
for(int i = 0; i < n; i++)
{
int j = i*12; // 2 equations (in x, y) with 6 members: skip 12 elements
int k = i*12+6; // second equation: skip extra 6 elements
a[j] = a[k+3] = src[i].x;
a[j+1] = a[k+4] = src[i].y;
a[j+2] = a[k+5] = 1;
a[j+3] = a[j+4] = a[j+5] = 0;
a[k] = a[k+1] = a[k+2] = 0;
b[i*2] = dst[i].x;
b[i*2+1] = dst[i].y;
}
solve(A, B, X, DECOMP_SVD);
delete a;
delete b;
return M;
}
// call original transform
vector<Point2f> src(3);
vector<Point2f> dst(3);
src[0] = Point2f(0.0, 0.0);src[1] = Point2f(1.0, 0.0);src[2] = Point2f(0.0, 1.0);
dst[0] = Point2f(0.0, 0.0);dst[1] = Point2f(1.0, 0.0);dst[2] = Point2f(0.0, 1.0);
Mat M = getAffineTransform(Mat(src), Mat(dst));
cout<<M<<endl;
// call new transform
src.resize(4); src[3] = Point2f(22, 2);
dst.resize(4); dst[3] = Point2f(22, 2);
Mat M2 = getAffineTransformOverdetermined(src.data(), dst.data(), src.size());
cout<<M2<<endl;
हो सकता है कि [estimateRigidTransform] (http://docs.opencv.org/modules/video/doc/motion_analysis_and_object_tracking।एचटीएमएल # अनुमानित फिल्टर ट्रांसफॉर्म) आपकी आवश्यकताओं के अनुरूप होगा। – cgat