2014-04-11 7 views
27

मैं एक सीवी में कुछ पिक्सेल के लिए एक नया रंग मान सेट करने के लिए कोशिश कर रहा हूँ चटाई :: चटाई छवि मेरे कोड के नीचे है:C++ और opencv हो और सेट पिक्सेल रंग

Mat image = img; 
    for(int y=0;y<img.rows;y++) 
    { 
     for(int x=0;x<img.cols;x++) 
     { 
     Vec3b color = image.at<Vec3b>(Point(x,y)); 
     if(color[0] > 150 && color[1] > 150 && color[2] > 150) 
     { 
      color[0] = 0; 
      color[1] = 0; 
      color[2] = 0; 
      cout << "Pixel >200 :" << x << "," << y << endl; 
     } 
     else 
     { 
      color.val[0] = 255; 
      color.val[1] = 255; 
      color.val[2] = 255; 
     } 
    } 
    imwrite("../images/imgopti"+to_string(i)+".tiff",image); 

यह प्राप्त करने के लिए लगता है उत्पादन में अच्छा पिक्सेल (कोउट के साथ) हालांकि आउटपुट छवि (इमराइट के साथ) में संबंधित पिक्सेल संशोधित नहीं होते हैं। मैंने पहले ही color.val [0] का उपयोग करने का प्रयास किया है .. मैं अभी भी यह नहीं समझ सकता कि आउटपुट छवि में पिक्सेल रंग क्यों नहीं बदलते हैं। धन्यवाद

उत्तर

43

आपने नए पिक्सेल मान को छवि पर वापस कॉपी करने के अलावा सबकुछ किया।

यह पंक्ति एक स्थानीय चर में पिक्सेल की एक प्रति ले जाता है: color बदलने के बाद

Vec3b color = image.at<Vec3b>(Point(x,y)); 

तो, जैसा कि आप की आवश्यकता होती है, बस इसे वापस सेट इस तरह:

image.at<Vec3b>(Point(x,y)) = color; 

तो, में पूर्ण, इस तरह कुछ:

Mat image = img; 
for(int y=0;y<img.rows;y++) 
{ 
    for(int x=0;x<img.cols;x++) 
    { 
     // get pixel 
     Vec3b color = image.at<Vec3b>(Point(x,y)); 

     // ... do something to the color .... 

     // set pixel 
     image.at<Vec3b>(Point(x,y)) = color; 
    } 
} 
12

बस एक संदर्भ का उपयोग करें:

Vec3b & color = image.at<Vec3b>(y,x); 
color[2] = 13; 
+1

के लूप के साथ पिक्सेल के माध्यम से पुनरावृत्त करें क्योंकि समस्या रंगीन मैट के बारे में थी। उचर मामले में, ओसीसी में। 'uchar & c = image.at (y, x)' – berak

+0

क्षमा करें, मेरा मतलब है कि एक और उत्तर टिप्पणी करें, और +1। –

8

मैं प्रदर्शन कारणों से .at का उपयोग नहीं करता। चटाई छवि

//#pragma pack(push, 2) //not useful (see comments below) 
struct RGB { 
    uchar blue; 
    uchar green; 
    uchar red; }; 

और फिर अपने सीवी पर इस तरह इसका इस्तेमाल :::

एक struct को परिभाषित करें

RGB& rgb = image.ptr<RGB>(y)[x]; 

image.ptr (y) आप scanline y के लिए सूचक देता है । और x और y

+0

'आकार' (uchar) '1 है तो' पैक' मान को 2 पर सेट करने की क्या समझ है? –

+0

कंपाइलर एक स्ट्रक्चर में पैडिंग बाइट्स जोड़ देगा। पैक की सेटिंग उन पैडिंग को बदल देती है ताकि डेटा किसी अन्य तरीके से गठबंधन हो। संपादन: इस पोस्ट को देखें http://stackoverflow.com/questions/3318410/pragma-pack-effect – Flocke

+2

'प्रज्ञा' का कोई संरचना नहीं है पूरी तरह से 'उचर' से। एक अच्छा स्पष्टीकरण पढ़ें [यहां] (http://publib.boulder.ibm.com/infocenter/compbgpl/v9v111/index.jsp?topic=/com.ibm.xlcpp9.bg.doc/compiler_ref/pragma_pack.htm) के लिए विवरण। –

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