आप isContinuous के लिए OpenCV दस्तावेज़ में देख सकते हैं:
विधि TRUE देता मैट्रिक्स तत्वों प्रत्येक पंक्ति के अंत में अंतराल के बिना लगातार जमा हो जाती है। अन्यथा, यह झूठी वापसी करता है। जाहिर है, 1x1 या 1xN matrices हमेशा निरंतर हैं। Mat :: create() के साथ बनाए गए मैट्रिस हमेशा निरंतर होते हैं। लेकिन यदि आप Mat :: col(), Mat :: diag(), और इसी तरह से मैट्रिक्स का एक हिस्सा निकालते हैं, या बाहरी आवंटित डेटा के लिए मैट्रिक्स हेडर का निर्माण करते हैं, तो ऐसे मैट्रिस में अब यह संपत्ति नहीं हो सकती है।
तो, जब तक आप एक नया मैट्रिक्स बना रहे हैं (यानी आप create पर कॉल कर रहे हैं), तो आपका मैट्रिक्स निरंतर रहेगा।
create
काम करता है की तरह है:
- वर्तमान सरणी आकार और प्रकार नए लोगों से मेल खाते हैं, तो तुरंत वापस जाएँ। अन्यथा, Mat :: रिलीज() को कॉल करके पिछले डेटा को डी-रेफरेंस करें।
- नया हेडर आरंभ करें।
- कुल() * elemSize() बाइट्स का नया डेटा आवंटित करें।
- डेटा, संदर्भ काउंटर से जुड़े नए को आवंटित करें और इसे 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;
}
मुझे लगता है कि यदि आप अजीब छवि आयामों के साथ आईपीपी जैसी चीजों का उपयोग करते हैं तो यह निरंतर गारंटी नहीं है। तो यह आपके speicific OpenCV निर्माण पर निर्भर हो सकता है। – Micka