2012-04-02 11 views
14

मैं मैट (या Mat3b) चर से पिक्सल को संपादित/पढ़ने के लिए एक कुशल तरीका ढूंढ रहा हूं।Mat variable से OpenCv में पिक्सेल मानों को संपादित/पढ़ने के लिए कैसे?

मैं का इस्तेमाल किया है: -

Image.at<Vec3b>(i,j) 

लेकिन यह बहुत धीमी गति से हो रहा है।

मैं भी इस का इस्तेमाल किया: -

A.data[A.channels()*A.cols*i + j + 0] 

लेकिन समस्या यह है कि मैं इस के साथ सामना करना पड़ रहा है जब मैं इस पाश

for(i=0; j<A.rows; i++){ 
    for(j=0; j<A.cols; j++){ 
      A.data[A.channels()*A.cols*i + j + 0] = 0; 
      A.data[A.channels()*A.cols*i + j + 1] = 0; 
      A.data[A.channels()*A.cols*i + j + 2] = 0; 
    } 
} 

केवल छवि के एक हिस्से को काला है चलाते हैं।

+0

वहाँ, स्वीकार किए जाते हैं जवाब के रूप में सही ढंग से कहा गया चटाई तत्वों का उपयोग करने के लिए तेजी से रास्ता है, लेकिन रिलीज मोड में अपने कार्यक्रम चलाने ऊपर एक बहुत चटाई तेज़ हो जाएगी .at () एक्सेस करता है। वे पॉइंटर एक्सेस – Sam

उत्तर

18

Here आप तेजी से तत्व का उपयोग के लिए संभावनाओं के कुछ देख सकते हैं।

लेकिन यदि आप इसे अपना रास्ता बनाना चाहते हैं, तो आपको एक ब्रैकेट जोड़ने की आवश्यकता है। नहीं तो आप सूचकांक गणना सही नहीं है:

for(int i=0; i<A.rows; i++){ 
    for(int j=0; j<A.cols; j++){ 
      A.data[A.channels()*(A.cols*i + j) + 0] = 0; 
      A.data[A.channels()*(A.cols*i + j) + 1] = 0; 
      A.data[A.channels()*(A.cols*i + j) + 2] = 0; 
    } 
} 

लेकिन स्मृति के लेआउट गद्दी की वजह से आस पास होने की गारंटी नहीं है। तो this के अनुसार यदि आप इसके बजाय इस तरह एक सूत्र का उपयोग करना चाहिए:

for(int i=0; i<A.rows; i++){ 
    for(int j=0; j<A.cols; j++){ 
      A.data[A.step[0]*i + A.step[1]* j + 0] = 0; 
      A.data[A.step[0]*i + A.step[1]* j + 1] = 0; 
      A.data[A.step[0]*i + A.step[1]* j + 2] = 0; 
    } 
} 
+0

एडाटा [एस्टेप [0] * i + A.step [1] * j + 0] = 0 से थोड़ा धीमा हो जाएगा; यह लाइन मुझे त्रुटि दे रही है। –

+2

मैंने A.data [एस्टेप * i + A.channels() * j + 0] का उपयोग किया, यह ठीक काम कर रहा है। धन्यवाद यह पिछले विधि की तुलना में बहुत कम समय ले रहा है। :) –

14

यह सीवी :: मैट से पिक्सल को संपादित/पढ़ने के लिए सबसे प्रभावी तरीका है। (यदि आवश्यक विशिष्ट चैनल का) एक पंक्ति के लिए सूचक बनाएं

for(int i=0; i<A.rows;i++){ 
    uchar* rowi = A.ptr/*<uchar>*/(i); 
    for(int j=0; j<A.cols; j++){ 
    doProcessOnPixel(rowi[j]); 
    } 
} 
संबंधित मुद्दे