2015-11-12 16 views
9

मुझे पता है कि, ओपनसीवी मैट्रिक्स में निहित डेटा निरंतर होने की गारंटी नहीं है।क्या ओपनसीवी मैट्रिक्स डेटा निरंतर होने की गारंटी है?

enter image description here

OpenCV एक समारोह isContinuous कहा जाता है() यदि किसी विशेष मैट्रिक्स के डेटा निरंतर है परीक्षण करने के लिए प्रदान करता है: अपने आप को स्पष्ट करने के लिए यहां OpenCV प्रलेखन से एक पैराग्राफ है। मेरे सवाल कर रहे हैं

(1) के रूप में इस प्रकार है

Mat img = cv::imread(img_name) 

img में डेटा निरंतर होने की गारंटी है, तो मैं एक नया मैट्रिक्स बनाने?

(2) मुझे पता है कि मौजूदा मैट्रिक्स से डेटा उधार करके एक नया मैट्रिक्स बनाने small_mat incontinuous डेटा

cv::Mat small_mat = large_mat.col(0); 

ऊपर कोड एक नया मैट्रिक्स बनाता है, में परिणाम होगा, 0 उधार large_mat की मई के स्तंभ, small_mat में incontinuous डेटा के लिए अग्रणी। तो सवाल यह है कि, यदि मैं मौजूदा मैट्रिक्स से डेटा उधार लेने के बिना एक नया नया मैट्रिक्स बनाता हूं, तो क्या ब्रांड के नए मैट्रिक्स में असंतुलित डेटा होगा?

(3) क्या निम्न कोड निरंतर डेटा के साथ मैट्रिक्स बनाने की गारंटी है?

cv::Mat mat(nRows, nCols, CV_32FC1); 
+0

मुझे लगता है कि यदि आप अजीब छवि आयामों के साथ आईपीपी जैसी चीजों का उपयोग करते हैं तो यह निरंतर गारंटी नहीं है। तो यह आपके speicific OpenCV निर्माण पर निर्भर हो सकता है। – Micka

उत्तर

9

आप isContinuous के लिए OpenCV दस्तावेज़ में देख सकते हैं:

विधि TRUE देता मैट्रिक्स तत्वों प्रत्येक पंक्ति के अंत में अंतराल के बिना लगातार जमा हो जाती है। अन्यथा, यह झूठी वापसी करता है। जाहिर है, 1x1 या 1xN matrices हमेशा निरंतर हैं। Mat :: create() के साथ बनाए गए मैट्रिस हमेशा निरंतर होते हैं। लेकिन यदि आप Mat :: col(), Mat :: diag(), और इसी तरह से मैट्रिक्स का एक हिस्सा निकालते हैं, या बाहरी आवंटित डेटा के लिए मैट्रिक्स हेडर का निर्माण करते हैं, तो ऐसे मैट्रिस में अब यह संपत्ति नहीं हो सकती है।

तो, जब तक आप एक नया मैट्रिक्स बना रहे हैं (यानी आप create पर कॉल कर रहे हैं), तो आपका मैट्रिक्स निरंतर रहेगा।

create काम करता है की तरह है:

  1. वर्तमान सरणी आकार और प्रकार नए लोगों से मेल खाते हैं, तो तुरंत वापस जाएँ। अन्यथा, Mat :: रिलीज() को कॉल करके पिछले डेटा को डी-रेफरेंस करें।
  2. नया हेडर आरंभ करें।
  3. कुल() * elemSize() बाइट्स का नया डेटा आवंटित करें।
  4. डेटा, संदर्भ काउंटर से जुड़े नए को आवंटित करें और इसे 1 पर सेट करें।

इसका मतलब है कि जब आप (अंतर्निहित) कॉल बनाते हैं, तो मैट्रिक्स निरंतर (चरण 3) होगा। क्योंकि imread आंतरिक create कॉल


आपके प्रश्नों

अगर मैं imread के साथ एक नया मैट्रिक्स बनाने, डेटा निरंतर

हाँ होने की गारंटी है।

मुझे पता है कि मौजूदा मैट्रिक्स से डेटा उधार लेकर एक नया मैट्रिक्स बनाने के परिणामस्वरूप असंतुलित डेटा होगा।

सही, डेटा गैर निरंतर होगा। नया मैट्रिक्स निरंतर बनाने के लिए, आप clone() पर कॉल कर सकते हैं, जो नया मैट्रिक्स बनाने के लिए create पर कॉल करता है।

यदि मैं मौजूदा मैट्रिक्स से डेटा उधार लेने के बिना एक नया नया मैट्रिक्स बनाता हूं, तो ब्रांड के नए मैट्रिक्स में असंतुलित डेटा होगा?

हाँ, निर्माता आंतरिक create कहता है।

मैट्रिक्स कन्स्ट्रक्टर को लगातार डेटा के साथ मैट्रिक्स बनाने की गारंटी है?

हाँ, निर्माता आंतरिक create कहता है।

यह संक्षेप में प्रस्तुत करने के लिए एक छोटा सा उदाहरण है:

#include <opencv2\opencv.hpp> 
#include <iostream> 
using namespace std; 
using namespace cv; 

int main() 
{ 
    // Read image 
    Mat img = imread("path_to_image"); 
    cout << "img is continuous? " << img.isContinuous() << endl; 
    // Yes, calls create internally 

    // Constructed a matrix header for externally allocated data 
    Mat small_mat = img.col(0); 
    cout << "small_mat is continuous? " << small_mat.isContinuous() << endl; 
    // No, you're just creating a new header. 

    // Matrix (self) expression 
    small_mat = small_mat + 2; 
    cout << "small_mat is continuous? " << small_mat.isContinuous() << endl; 
    // No, you're not even creating a new header 

    // Matrix expression 
    Mat expr = small_mat + 2; 
    cout << "expr is continuous? " << expr.isContinuous() << endl; 
    // Yes, you're creating a new matrix 

    // Clone 
    Mat small_mat_cloned = img.col(0).clone(); 
    cout << "small_mat_cloned is continuous? " << small_mat_cloned.isContinuous() << endl; 
    // Yes, you're creating a new matrix 

    // Create 
    Mat mat(10, 10, CV_32FC1); 
    cout << "mat is continuous? " << mat.isContinuous() << endl; 
    // Yes, you're creating a new matrix 

    return 0; 
} 
1

बनाते Mat::create के साथ एक Mat, यह निरंतर है। इस तरह के ऑपरेशन स्पष्ट रूप से Mat::create, या निहित Mat::clone, Mat::Mat(...) जैसे ऑपरेशन।

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