2012-06-27 12 views
7

मैं एक मैट को किसी अन्य फ़ंक्शन में पास कर रहा हूं और इसे फ़ंक्शन के अंदर बदल रहा हूं। मुझे उम्मीद थी कि एक अधिक जटिल प्रकार होने के कारण यह संदर्भ द्वारा स्वचालित रूप से पारित किया गया था ताकि कॉलिंग फ़ंक्शन में मैट्रिक्स बदल गया हो, लेकिन ऐसा नहीं होता है। क्या कोई मुझे किसी फ़ंक्शन से बदले गए मैट को सही तरीके से वापस करने के तरीके के बारे में बता सकता है?ओपनसीवी एक फ़ंक्शन के अंदर मैट बदल रहा है (मैट स्कोप)

void callingFunction(Mat img) 
{ 
    Mat tst(100,500,CV_8UC3, Scalar(0,255,0)); 
    saveImg(tst, "Original image", true); 
    testImg(tst); 
    saveImg(tst, "Want it to be same as inside testImg but is same as Original", true); 
} 

void testImg(Mat img) 
{ 
    int rs = 50; // rows 
    int cs = 100; // columns 
    img = Mat(rs, cs, CV_8UC3, Scalar(255,0,0)); 
    Mat roi(img, Rect(0, 0, cs, rs/2)); 
    roi = Scalar(0,0,255); // change a subsection to a different color 

    saveImg(img, "inside testImg", true); 
} 

धन्यवाद:

यहाँ कोड का टुकड़ा है!

उत्तर

8

आपको Mat को parameter-reference (&) के रूप में परिभाषित करना होगा। यहाँ से संपादित किए जाने कोड:

void callingFunction(Mat& img) 
{ 
    Mat tst(100,500,CV_8UC3, Scalar(0,255,0)); 
    saveImg(tst, "Original image", true); 
    testImg(tst); 
    saveImg(tst, "Want it to be same as inside testImg but is same as Original", true); 
} 

void testImg(Mat& img) 
{ 
    int rs = 50; // rows 
    int cs = 100; // columns 
    img = Mat(rs, cs, CV_8UC3, Scalar(255,0,0)); 
    Mat roi(img, Rect(0, 0, cs, rs/2)); 
    roi = Scalar(0,0,255); // change a subsection to a different color 

    saveImg(img, "inside testImg", true); 
} 
+0

तो मुझे स्पष्ट रूप से संदर्भ द्वारा पास करना होगा। धन्यवाद! – zzzz

-2

अपने असली आप स्पष्ट रूप से संदर्भ द्वारा पारित करने के लिए है कि, तो कैसे सब OpenCV कार्यों काम करते हैं? उनमें से कोई भी संदर्भ द्वारा मूल्यों को पास नहीं करता है, फिर भी वे किसी भी तरह से पास में मट में लिखने लगते हैं।

//! applies generalized Sobel operator to the image 
CV_EXPORTS_W void Sobel(InputArray src, OutputArray dst, int ddepth, 
         int dx, int dy, int ksize=3, 
         double scale=1, double delta=0, 
         int borderType=BORDER_DEFAULT); 

के रूप में आप देख सकते हैं, यह एक & बिना src और डीएसटी में गुजरता है: उदाहरण के लिए, यहाँ imgproc.hpp में सोबेल समारोह के लिए घोषणा है। और फिर भी मुझे पता है कि जब मैं सोबेल को खाली डीएसटी के साथ बुलाता हूं, तो यह खत्म हो जाएगा। नहीं '&' शामिल है।

+2

typedef _OutputArray और आउटपुटअरे; - आप सादे गलत हैं। – berak

2

मुझे एक ही प्रश्न के बारे में आश्चर्य हुआ, इसलिए मैं @ArtemStorozhuk (जो सही है) द्वारा दिए गए उत्तर को और स्पष्ट करना चाहता हूं।

OpenCV प्रलेखन यहाँ भ्रामक है, क्योंकि ऐसा लगता है कि आप मूल्य से मैट्रिक्स गुजर रहे हैं, लेकिन वास्तव में सीवी के निर्माता :: OutputArray परिभाषित किया गया है इस प्रकार है:

_OutputArray::_OutputArray(Mat& m) 

तो यह मैट्रिक्स हो जाता है संदर्भ से!

चूंकि ऑपरेशन जैसे सीवी :: मैट :: एक नया मैट्रिक्स बनाते हैं, ऑपरेशन संदर्भ जारी करता है और कूटर को 1 पर सेट करता है। इस प्रकार, परिणाम कॉलिंग फ़ंक्शन में रखने के लिए, आपको मैट्रिक्स को पास करना होगा संदर्भ से।

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