2011-12-14 15 views
6

मैं कैमरे अंशांकन के बाद बिंदुओं के सेट को कम करने के लिए ओपनसीवी का उपयोग करता हूं। कोड निम्नानुसार है।कैमरा शॉट निर्देशांक में अंक को कम करने और संबंधित अनियंत्रित छवि निर्देशांक प्राप्त करने के लिए कैसे?

-8.82689655e-001 -7.05507338e-001 4.16228324e-001 3.04863811e-001 

जो src में संख्या के साथ तुलना में बहुत छोटे हैं:

const int npoints = 2; // number of point specified 

// Points initialization. 
// Only 2 ponts in this example, in real code they are read from file. 
float input_points[npoints][2] = {{0,0}, {2560, 1920}}; 

CvMat * src = cvCreateMat(1, npoints, CV_32FC2); 
CvMat * dst = cvCreateMat(1, npoints, CV_32FC2); 

// fill src matrix 
float * src_ptr = (float*)src->data.ptr; 
for (int pi = 0; pi < npoints; ++pi) { 
    for (int ci = 0; ci < 2; ++ci) { 
     *(src_ptr + pi * 2 + ci) = input_points[pi][ci]; 
    } 
} 

cvUndistortPoints(src, dst, &camera1, &distCoeffs1); 

बाद dst ऊपर कोड निम्नलिखित संख्या में शामिल है।

एक ही समय अगर मैं कॉल के माध्यम से छवि undistort में:

cvUndistort2(srcImage, dstImage, &camera1, &dist_coeffs1); 

मैं अच्छा undistorted छवि जिसका अर्थ है कि पिक्सेल निर्देशांक अलग अंक की तुलना में तो काफी संशोधित नहीं कर रहे हैं प्राप्त करते हैं।

छवियों के लिए विशिष्ट बिंदुओं के लिए समान उन्मूलन कैसे प्राप्त करें? धन्यवाद। एक स्तंभ या दो चैनलों के साथ एक पंक्ति मैट्रिक्स -

+0

क्या आप वाकई कैमरा 1 और कैमरा समान हैं? – Sam

+0

हां, वही - मैंने प्रश्न तय कर लिया है। इंगित करने के लिए धन्यवाद। इसके अलावा शुरुआत में मुझे इमगुसीवी में ऐसा व्यवहार प्राप्त हुआ और फिर यह पता लगाने की कोशिश की कि इस तरह के व्यवहार को पेश किया गया है: ओपनसीवी या इमगुसीवी में ही। यह ओपनसीवी में दिखाई दिया। – sergtk

उत्तर

10

अंक मैट्रिक्स का उपयोग करके अंक "असामान्य" होना चाहिए।

अधिक विशेष रूप से, के बाद cvUndistortPoints निम्नलिखित परिवर्तन की कॉल भी जोड़ा जाना चाहिए:

double fx = CV_MAT_ELEM(camera1, double, 0, 0); 
double fy = CV_MAT_ELEM(camera1, double, 1, 1); 
double cx = CV_MAT_ELEM(camera1, double, 0, 2); 
double cy = CV_MAT_ELEM(camera1, double, 1, 2); 

float * dst_ptr = (float*)dst->data.ptr; 
for (int pi = 0; pi < npoints; ++pi) { 
    float& px = *(dst_ptr + pi * 2); 
    float& py = *(dst_ptr + pi * 2 + 1); 
    // perform transformation. 
    // In fact this is equivalent to multiplication to camera matrix 
    px = px * fx + cx; 
    py = py * fy + cy; 
} 
OpenCV पर कैमरा मैट्रिक्स पर

अधिक जानकारी 'Camera Calibration and 3D Reconstruction'

अद्यतन:

सी के बाद ++ समारोह बुलाना चाहिए साथ ही काम करें:

std::vector<cv::Point2f> inputDistortedPoints = ... 
std::vector<cv::Point2f> outputUndistortedPoints; 
cv::Mat cameraMatrix = ... 
cv::Mat distCoeffs = ... 

cv::undistortPoints(inputDistortedPoints, outputUndistortedPoints, cameraMatrix, distCoeffs, cv::noArray(), cameraMatrix); 
1

यह अपने मैट्रिक्स आकार :)

OpenCV अंक की एक वेक्टर की उम्मीद हो सकती है। लेकिन क्योंकि आपका इनपुट मैट्रिक्स केवल 2 अंक है, और चैनलों की संख्या भी 1 है, यह पता नहीं लगा सकता कि इनपुट, पंक्ति या कॉलम क्या है।

तो, फर्जी मूल्यों के साथ एक लंबे समय तक इनपुट चटाई भर सकते हैं और केवल पहले रखें:

const int npoints = 4; // number of point specified 

// Points initialization. 
// Only 2 ponts in this example, in real code they are read from file. 
float input_points[npoints][4] = {{0,0}, {2560, 1920}}; // the rest will be set to 0 

CvMat * src = cvCreateMat(1, npoints, CV_32FC2); 
CvMat * dst = cvCreateMat(1, npoints, CV_32FC2); 

// fill src matrix 
float * src_ptr = (float*)src->data.ptr; 
for (int pi = 0; pi < npoints; ++pi) { 
    for (int ci = 0; ci < 2; ++ci) { 
     *(src_ptr + pi * 2 + ci) = input_points[pi][ci]; 
    } 
} 

cvUndistortPoints(src, dst, &camera1, &distCoeffs1); 

संपादित

OpenCV निर्दिष्ट करता है जबकि undistortPoints केवल 2 चैनल इनपुट स्वीकार करते हैं, वास्तव में, यह स्वीकार करता है

  • 1-स्तंभ, 2-चैनल, बहु पंक्ति चटाई या (और इस मामले दर्ज नहीं किया गया है)
  • 2 कॉलम, बहु पंक्ति, 1 चैनल चटाई या
  • बहु-स्तंभ, 1 पंक्ति, 2-चैनल चटाई

(undistort.cpp के रूप में देखा, लाइन 390)

लेकिन अंदर एक बग (या उपलब्ध जानकारी की कमी), कॉलम की संख्या 2 होने पर गलत तरीके से दूसरे को मिलाकर बनाता है। इसलिए, आपके डेटा को 2-कॉलम, 2-पंक्ति, 1-चैनल माना जाता है।

+0

जब आप 1 चैनल कहते हैं तो आपका क्या मतलब है? मैं cvCreateMat में निरंतर CV_32FC2 का उपयोग करता हूं, जिसका अर्थ है 2 चैनल। धन्यवाद। – sergtk

+1

मैंने undistortPoints() func के स्रोत कोड को देखा है, और दस्तावेज़ीकरण गलत है। विवरण के लिए ऊपर दिए गए संपादन को देखें, कृपया – Sam

+0

लेकिन ऐसा लगता है कि आपका उत्तर सही है – Sam

संबंधित मुद्दे

 संबंधित मुद्दे