2012-09-20 16 views
7

यहां समस्या है: मैं OpenCV v.2.4.2 के साथ एक ग्रेस्केल छवि लोड करता हूं। अब मैं स्थिति (0,0) पर पिक्सेल के उदाहरण मान के लिए जानना चाहता हूं। मैं कोशिश की है:ओपनसीवी मैट्रिक्स मान प्रदर्शित

Mat image=imread("00001.jpg",1); 
cvtColor(image,image,CV_RGB2GRAY); 
int a=image.at<unsigned>(0,1); 
printf("%d ",a); 

यह वास्तव में काम नहीं करता। किसी भी डेटा प्रकार (सीवी_8 यू, सीवी_32 एस ...) के साथ पिक्सेल मान कैसे प्राप्त करें?

धन्यवाद !!!

+0

आप (0,0) के बजाय (0,1) का उपयोग कर रहे हैं? – count0

उत्तर

4

आप यहां दो गलतियां कर रहे हैं।

छवि पढ़ने के दौरान, आप इनपुट तर्क के रूप में 1 निर्दिष्ट कर रहे हैं। जैसा कि imread के लिए समझाया गया है, फ़ंक्शन छवि को तीन अलग-अलग प्रारूपों में पढ़ सकता है।

CV_LOAD_IMAGE_UNCHANGED (< 0) छवि है के रूप में (अल्फ़ा चैनल भी शामिल होगी कि अब तक) को लोड करता है CV_LOAD_IMAGE_GRAYSCALE (0) एक
CV_LOAD_IMAGE_COLOR (> 0) आरजीबी प्रारूप में छवि लोड एक तीव्रता के रूप में छवि लोड जो corr नहीं है image.at<unsigned>(0,1);:

अपने मामले के लिए

आप दूसरा तर्क के रूप में उपयोग करने के लिए CV_LOAD_IMAGE_GRAYSCALE

अगले चरण में आप जहां प्रयोग कर रहे हैं होगा कुछ भी करने के लिए espond। आप <unsigned> का उपयोग करते हैं लेकिन संकलक कहते हैं "अनसुलझा? क्या हस्ताक्षर किया ???"

मुझे विश्वास है कि ऐसा करने का एक बेहतर तरीका CV_LOAD_IMAGE_COLOR या CV_LOAD_IMAGE_GRAYSCALE जैसे सही लेबल का उपयोग करना है। नीचे दिए गए उदाहरण में, मैं छवि को एक चैनल (CV_LOAD_IMAGE_GRAYSCALE) में पढ़ रहा हूं, जो स्वचालित रूप से इसे ग्रेस्केल में परिवर्तित कर देता है।

#include <cv.h> 
#include <highgui.h> 

#include <iostream> 

using namespace std; 
using namespace cv; 

int main() 
{ 
    Mat gImg = imread("img.png", CV_LOAD_IMAGE_GRAYSCALE); 

    uchar val; 
    val = gImg.at<uchar>(0,0); 

    cout << (int)val << endl; 

    imshow("showImg",gImg); 
    cvWaitKey(0); 

    return 1; 
} 
+0

ठीक है, ठीक है, यह काम करता है, लेकिन क्या आपने कोशिश की है कि यह वास्तव में क्या आउटपुट करता है? मेरे मामले में मुझे पिक्सेल (0,0) के लिए -89 मिलते हैं। यह छवि कैसे संभव है जब छवि 8 बिट हस्ताक्षरित है? अगला मैं पूछना चाहता हूं कि आप उचर का उपयोग क्यों करते हैं? –

+0

संभोग मैंने कोशिश की है। मुझे नहीं पता कि आपको आउटपुट सही तरीके से क्यों नहीं मिल रहा है। मैंने UCHAR का बिल्कुल उसी कारण से उपयोग किया है जो उपरोक्त टिप्पणी में @ count0 द्वारा समझाया गया है, यानी यह 0 से 255 – masad

+1

के बीच मान का प्रतिनिधित्व कर सकता है आप इस तरह से इमेड का उपयोग नहीं कर सकते हैं। दूसरा तर्क एक ध्वज है जो 0,> 0 या <0 है, यदि आप छवि ग्रेस्केल, 3-चैनल रंग या जैसा पढ़ना चाहते हैं, इस पर निर्भर करता है। आप बिल्कुल प्रकार निर्दिष्ट नहीं कर सकते हैं। यह सिर्फ विशिष्ट मामले में चलता है क्योंकि सीवी_8 यू == 0 – Sassa

0

आप पता लगाने के लिए क्या opencv यह प्रतिनिधित्व के साथ एक बेहतर विचार किस प्रकार का उपयोग करने के लिए किया था की कोशिश कर सकते:

cout << image.depth() << ", " << image.channels() << endl; 

भी तत्व का उपयोग के बारे में इस discussion की जाँच करें।

+0

खैर, मुझे गहराई और चैनल पता है, लेकिन अगर मुझे पता है कि मैट्रिक्स सामान्य छवि 8 बिट और हस्ताक्षरित पूर्णांक के लिए है ताकि मैट्रिक्स सीवी_8 यूसी 1 है, तो मुझे पैरामीटर को मैट :: पर पास करना चाहिए? बिल्कुल यहां: image.at (0,1); –

+0

सीवी_8 यूसी 1 का मतलब 8-बिट हस्ताक्षरित एकल-चैनल है, इसलिए यह 'हस्ताक्षरित चार' होगा जो 0..255 से मानों का प्रतिनिधित्व करता है। असाइन किए गए पूर्णांक 0..65536 से मानों का प्रतिनिधित्व करेंगे जो सीवी_16 यूसी 1 होगा। – count0

0

सबसे पहले, इस तरह पिक्सेल मान प्राप्त करने का कोई सामान्य तरीका नहीं है। मतलब है कि यदि आप at का उपयोग करने जा रहे हैं तो आपको हमेशा अपने मूल्यों का सही प्रकार निर्दिष्ट करना होगा। इस मामले में, आपको a=image.at<uchar>(0,1); करना चाहिए क्योंकि आप अपनी छवि को 8-बिट हस्ताक्षरित ग्रेस्केल (1-चैनल) में कनवर्ट करते हैं।

आपको आरजीबी 2GRAY के बजाय शायद CV_BGR2GRAY का उपयोग करना चाहिए क्योंकि ओपनसीवी बीजीआर का उपयोग चैनल ऑर्डर के रूप में करता है।

तुम भी शुरू से ही ग्रेस्केल के रूप में अपनी छवि को पढ़ सकते हैं और uchar फिर से इस्तेमाल कर सकते हैं:

Mat image = imread("00001.jpg",0); // note the 0 flag 
int a=image.at<uchar>(0,1); 
printf("%d ",a); 
1

ऐसा करने के लिए एक आसान तरीका है।

चटाईMat.data एक सूचक जो मूल डेटा मैट्रिक्स को संदर्भित करता है देता है।

वें पंक्ति और महीना स्तंभ के पिक्सेल मूल्यों को प्राप्त करने के लिए,

Mat img = imread("filename.jpg",CV_LOAD_IMAGE_COLOR); 
unsigned char *input = (unsigned char*)(img.data); 

int i,j,r,g,b; 
for(int i = 0;i < img.cols;i++){ 
    for(int j = 0;j < img.rows;j++){ 
     b = input[img.cols * j + i ] ; 
     g = input[img.cols * j + i + 1]; 
     r = input[img.cols * j + i + 2]; 
    } 
} 

तो, यह एक रंगीन छवि के बारे में है। ग्रेस्केल छवियों के लिए,

Mat img = imread("filename.jpg",CV_LOAD_IMAGE_COLOR); 
Mat g; 
cvtColor(img, g, CV_BGR2GRAY); 
unsigned char *input = (unsigned char*)(g.data); 

int i,j,r,g,b; 
for(int i = 0;i < img.cols;i++){ 
    for(int j = 0;j < img.rows;j++){ 
     g = input[img.cols * j + i]; 
    } 
} 

इस blogpost पर और पढ़ें।

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