2017-07-19 20 views
17

के साथ छवियों पर लोगों के आयताकार चित्रों का पता लगाएं मेरे पास लोगों के चित्रों के साथ साल की किताबों की कई छवियां हैं और मैं उन चित्रों का पता लगाने वाले एल्गोरेटम बनाने की कोशिश कर रहा हूं। कम से कम, सही आयताकार चित्रों का पता लगाने के लिए। Example 1Example 2ओपनसीवी

मैं तीन दिशाओं की जांच के लिए कोशिश कर रहा हूँ:

  1. चेहरा पहचान
  2. डार्क आयतों का पता लगाने
  3. लोग OCR'ed से नाम निष्कर्षण (के बाद से चित्र उज्जवल पृष्ठभूमि पर आम तौर पर गहरे रंग की आकृतियों कर रहे हैं) ग्रंथ

उपरोक्त तीन एल्गोरिदम के परिणामों को जोड़कर, मुझे कुछ कार्यप्रणाली प्राप्त करने की उम्मीद है, जो लागू होगा कई अलग-अलग सालाना पृष्ठों के लिए।

आयताकार पहचान के लिए मुझे किसी भी मदद के लिए बहुत सराहना होगी। enter image description here

किनारों से आकृति को खोजने के लिए कोशिश कर रहा है:

System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
Mat source = Imgcodecs.imread("Path/to/image", Imgcodecs.CV_LOAD_IMAGE_ANYCOLOR); 
Mat destination = new Mat(source.rows(), source.cols(), source.type()); 

Imgproc.cvtColor(source, destination, Imgproc.COLOR_RGB2GRAY); 
Imgproc.GaussianBlur(destination, destination, new Size(5, 5), 0, 0, Core.BORDER_DEFAULT); 

int threshold = 100; 
Imgproc.Canny(destination, destination, 50, 100); 
Imgproc.Canny(destination, destination, threshold, threshold*3); 

इस बिंदु पर, मैं इस तरह के परिणाम: मैं 3.

यहाँ मेरी कोड an image के लिए लागू किया जाता है जावा और OpenCV के साथ शुरू इसके बाद के संस्करण:

List<MatOfPoint> contourDetections = new ArrayList<>(); 
    Mat hierarchy = new Mat(); 

    // Find contours 
    Imgproc.findContours(destination, contourDetections, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); 

    // Draw contours 
    Imgproc.drawContours(source, contours, -1, new Scalar(255,0,0), 2); 

इस परिणाम हो रही है: 01,237,

लेकिन यह सुनिश्चित नहीं है कि उन समोच्चों से आयतों को निकालने के लिए कैसे करें क्योंकि कई रेखाएं अपूर्ण हैं।

Mat lines = new Mat(); 
    int thre = 50; 
    int minLineSize = 250; 
    int lineGap = 80; 

    int ignoreLinesShorter = 300; 

    Imgproc.HoughLinesP(destination, lines, 1, Math.PI/180, thre, minLineSize, lineGap); 

    for(int c = 0; c < lines.rows(); c++) { 

     double[] vec = lines.get(c, 0); 

     double x1 = vec[0], 
       y1 = vec[1], 
       x2 = vec[2], 
       y2 = vec[3]; 

     // Filtering only verticat and horizontal lines 
     if(x1 == x2 || y1 == y2) { 

      // Filtering out short lines 
      if(Math.abs(x1 - x2) > ignoreLinesShorter || Math.abs(y1 - y2) > ignoreLinesShorter) { 

       Point start = new Point(x1, y1); 
       Point end = new Point(x2, y2); 

       // Draw line 
       Imgproc.line(source, start, end, new Scalar(0,0,255), 2); 
      } 
     } 
    } 

परिणाम:: HoughLinesP का उपयोग कर

किनारों पर वापस जाना और ऊर्ध्वाधर खोजने की कोशिश और क्षैतिज लाइनों

enter image description here

आकृति के साथ की तरह अभी भी सही आयतों को नहीं देख, मैं कर रहा हूँ कि मैं पता लगा सकता था। क्या आप मेरी सही दिशा में मदद कर सकते हैं? शायद इस कार्य को करने का एक आसान तरीका है?

+1

आकृति अपूर्ण हैं। क्या आपने कैनी में कम दहलीज मूल्यों की कोशिश की है? इसके अलावा आप 'contourArea' के साथ छोटे आकारों को आकार के अनुसार फ़िल्टर कर सकते हैं। –

+1

कैसे * समोच्च की सीमा बढ़ाएं और फिर सभी लंबवत और क्षैतिज रेखाओं का विस्तार करें? –

उत्तर

4

यह एक पूरा उत्तर नहीं है लेकिन शायद उपयोगी है।

मुझे निम्न कोड के साथ नीचे दी गई छवि मिलती है।

कोड आप http://answers.opencv.org/question/85884

पर मेरे पुराने जवाब देने के लिए उल्लेख कर सकते हैं अगर यह होनहार हम साथ मिलकर में सुधार करने की कोशिश करेंगे लगता है समझने के लिए। क्योंकि किनारों अधूरे हैं

enter image description here

#include <opencv2/highgui.hpp> 
#include <opencv2/imgproc.hpp> 

using namespace cv; 

int main(int argc, char** argv) 
{ 
    Mat img = imread("e:/test/twHVm.jpg"); 
    if (img.empty()) 
     return -1; 

    Mat resized, gray, reduced_h, reduced_w; 
    resize(img, resized, Size(), 1, 1); 

    cvtColor(resized, gray, CV_BGR2GRAY); 

    reduce(gray, reduced_h, 0, REDUCE_AVG); 
    reduce(gray, reduced_w, 1, REDUCE_AVG); 


    for (int i = 0; i < img.cols; i++) 
    { 
     if (reduced_h.at<uchar>(0, i) > 200) // this is experimental value 
     line(resized, Point(i, 0), Point(i, img.rows), Scalar(0, 255, 0), 1); 
    } 

    for (int i = 0; i < img.rows; i++) 
    { 
     if (reduced_w.at<uchar>(i, 0) > 225) // this is experimental value 
     line(resized, Point(0, i), Point(img.cols, i), Scalar(0, 255, 0), 1); 
    } 

    imshow("result", resized); 
    waitKey(0); 
    return 0; 
} 
+0

हाय, एक समान परियोजना पर काम करने के लिए प्रयोग किया जाता है। मेरे पास कुछ तस्वीरें थीं जो घुमाए गए थे और मुझे उन्हें सामान्य दिखाना था (सामान्य स्थिति में घुमाएं)। इसलिए मैंने यह पता लगाने में कामयाब रहे कि वे क्षैतिज या लंबवत हैं या उन्हें घुमाएं। लेकिन यह पता नहीं लगा सका कि वे प्रतिबिंबित हैं –

+0

आप एक नमूना छवि और अपने कोड के साथ एक और सवाल पूछ सकते हैं। मुझे देखें कि मैं आपकी मदद करता हूं या नहीं। – sturkmen

+0

आपके पास एक अच्छा परिणाम है, धन्यवाद। मैं आपके कोड पर एक नज़र डालेगा। –