2016-01-13 5 views
15

मैं ओपनसीवी लाइब्रेरी का उपयोग करके दो छवियों की तुलना करने की कोशिश कर रहा हूं (निर्धारित करें कि वे समान हैं या नहीं)। मैंने जावा रैपर को कॉन्फ़िगर किया और कई ट्यूटोरियल (ज्यादातर सी/सी ++ में) पाया कि मैं जावा में फिर से लिखने की कोशिश कर रहा हूं। मैं फीचर डिटेक्शन दृष्टिकोण का उपयोग कर रहा हूं।जावा में ओपनसीवी के साथ दो छवियों की तुलना

समस्या यह है कि मेरे पास वर्तमान में एल्गोरिदम का कोई उचित परिणाम नहीं है (यह दावा करता है कि दो समान छवियों में कुछ भी सामान्य नहीं है और अन्य दो छवियों के बीच मिलान मिलते हैं जो पूरी तरह अलग हैं)। क्या कोई सुझाव दे सकता है कि मैं कुछ उचित परिणामों के उत्पादन के लिए ओपनसीवी मैचर का उपयोग कैसे करूँ?

इस छवि तुलना

private static void compareImages(String path1, String path2) { 
    System.out.println(path1 + "-" + path2); 

    FeatureDetector detector = FeatureDetector.create(FeatureDetector.ORB); 
    DescriptorExtractor descriptor = DescriptorExtractor.create(DescriptorExtractor.ORB); 

    DescriptorMatcher matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); 

    // first image 
    Mat img1 = Imgcodecs.imread(path1, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE); 
    Mat descriptors1 = new Mat(); 
    MatOfKeyPoint keypoints1 = new MatOfKeyPoint(); 

    detector.detect(img1, keypoints1); 
    descriptor.compute(img1, keypoints1, descriptors1); 

    // second image 
    Mat img2 = Imgcodecs.imread(path2, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE); 
    Mat descriptors2 = new Mat(); 
    MatOfKeyPoint keypoints2 = new MatOfKeyPoint(); 

    detector.detect(img2, keypoints2); 
    descriptor.compute(img2, keypoints2, descriptors2); 

    // match these two keypoints sets 
    MatOfDMatch matches = new MatOfDMatch(); 
    matcher.match(descriptors1, descriptors2, matches); 

    for (DMatch m : matches.toArray()) { 
     // how to use these values to detect the similarity? They seem to be way off 
     // all of these values are in range 50-80 which seems wrong to me 
     System.out.println(m.distance); 
    } 
    } 

दुर्भाग्य से, सर्फ और झारना की तरह एल्गोरिदम नहीं उपलब्ध जावा आवरण में तो मैं ओर्ब उपयोग कर रहा हूँ कर रहे हैं के लिए अपने कोड है। मुझे कंप्यूटर दृष्टि के साथ कोई अनुभव नहीं है, मैं बस कुछ उचित परिणाम देने के लिए इस सरल तुलना एल्गोरिदम काम को प्राप्त करने की कोशिश कर रहा हूं। मुझे किसी भी मदद के लिए खुशी होगी!

संपादित करें: मेरा उपयोग-केस विभिन्न कोणों से ली गई छवियों के विरुद्ध इस एल्गोरिदम को चला रहा है। मैंने बेहतर कोड स्वरूपित करने के लिए अपना कोड अपडेट किया।

नमूना चित्रों की तुलना करने के लिए:

enter image description here enter image description here

+0

[उपयोगी हो सकता है] (http://stackoverflow.com/questions/15544158/error-matching-with-orb-in- एंड्रॉइड) – GPPK

+0

लिंक में एल्गोरिदम बिल्कुल वैसा ही लगता है जो मेरे पास है ... अभी भी बहुत खराब परिणाम उत्पन्न कर रहा है। मैं सिर्फ दो छवियों को लोड करना चाहता हूं और उनकी समानता – Smajl

+0

को इंगित करने वाले किसी प्रकार का मूल्य उत्पन्न करना चाहता हूं: मैंने 'सीवी :: स्टिचर' कक्षा के साथ दो छवियों को सिलाई करने की कोशिश की जो आंतरिक रूप से 'xfeatures2d :: SURF' का उपयोग करता है और stitcing विफल हो गया है। मुझे लगता है कि इसका मतलब है कि एसयूआरएफ – sturkmen

उत्तर

5

बस मेरे दो सेंट:

  1. वहाँ सर्फ करने का उपयोग कर सकते है और जावा में झारना: openCV DescriptorExtractor Reference। मैंने तीन साल पहले फंकी कार्यान्वयन की कोशिश की और पाया कि बाइनरी डिस्क्रिप्टर में कुछ बदलाव हो रहा है जब ओपनसीवी उन्हें जावा पर भेजता है। यह हो सकता है कि ओआरबी एक ही समस्या के अधीन है। क्या आपने जावा पक्ष पर सी या सी ++ से वर्णक के डेटा की तुलना की थी?

  2. ब्रूट फोर्स मैचर क्वेरी छवि में प्रत्येक सुविधा के लिए ट्रेन छवि से सबसे अच्छी मिलान सुविधा पाता है। भले ही यह पूरी तरह से अलग दिखता है। आपको मैचों के माध्यम से निकलना होगा और बुरे लोगों को छोड़ना होगा। कई रणनीतियों में मौजूद हैं, मैचों का सर्वश्रेष्ठ 20% लेना एक आसान होगा (लेकिन यह सभी बाहरी नहीं होगा)। Progressive Sample Consensus मेरे सेटअप में बहुत अच्छा प्रदर्शन किया।

  3. छवि समानता की तुलना करने के लिए सुविधाओं का उपयोग करना यह नुकसान है। फीचर गिनती और गुणवत्ता चित्र आकार और सामग्री के साथ भिन्न होती है, जिससे वैश्विक स्तर पर छवियों की तुलना करना मुश्किल हो जाता है (यदि आप जानना चाहते हैं कि कौन सी छवियां दूसरे की तुलना में संदर्भ के समान हैं)। आप Calib3d.findHomography(obj, scene, CV_RANSAC); के साथ एक छवि से दूसरी छवि में परिवर्तन का अनुमान लगा सकते हैं और ओवरलैपिंग क्षेत्रों के सामान्यीकृत पिक्सेल अंतर का उपयोग कर सकते हैं।
+0

द्वारा छवियों की मुस्कुराहट की पहचान करना मुश्किल है। एसयूआरएफ और एसआईएफटी के लिए - वे उपलब्ध एल्गोरिदम की enum में सूचीबद्ध हैं लेकिन यदि आप उनका उपयोग करने का प्रयास करते हैं, तो आपको "समर्थित नहीं" अपवाद मिलता है। मुझे उन्हें एक्सेस करने के लिए ओपनसीवी के कुछ पुराने संस्करण का उपयोग करना होगा। मैं बहुत खुश हूं अगर आप कुछ नमूना जावा कोड प्रदान कर सकते हैं जो मेरे से बेहतर काम करता है क्योंकि छवियों की समानताओं को रेटिंग करने के लिए हर रणनीति ने बहुत खराब परिणाम दिए हैं। इस बिंदु पर, मैं वास्तव में अटक गया हूँ: / – Smajl

0

जैसा कि this SO Question में बताया गया है, हिस्टोग्राम की तुलना करना सबसे आसान और सबसे सरल तरीका है। यदि आपके एल्गोरिदम को केवल एक विशिष्ट डेटासेट के लिए काम करने की आवश्यकता है, तो विभिन्न रंग चैनलों का उपयोग करके देखें कि आपके सेट में छवियां सबसे समानता साझा करती हैं।

हिस्टोग्राम दृष्टिकोण अव्यवहारिक प्रतीत हो सकता है, लेकिन आपकी छवियों की रंग समानता को देखते हुए मुझे विश्वास है कि यह कुछ उपयोग हो सकता है।

में फ़ोटोशॉप अपने दो छवियों 'हिस्टोग्राम की तुलना करने के बाद:

histogram comparison

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