के साथ छवियों पर लोगों के आयताकार चित्रों का पता लगाएं मेरे पास लोगों के चित्रों के साथ साल की किताबों की कई छवियां हैं और मैं उन चित्रों का पता लगाने वाले एल्गोरेटम बनाने की कोशिश कर रहा हूं। कम से कम, सही आयताकार चित्रों का पता लगाने के लिए। Example 1Example 2ओपनसीवी
मैं तीन दिशाओं की जांच के लिए कोशिश कर रहा हूँ:
- चेहरा पहचान
- डार्क आयतों का पता लगाने
- लोग OCR'ed से नाम निष्कर्षण (के बाद से चित्र उज्जवल पृष्ठभूमि पर आम तौर पर गहरे रंग की आकृतियों कर रहे हैं) ग्रंथ
उपरोक्त तीन एल्गोरिदम के परिणामों को जोड़कर, मुझे कुछ कार्यप्रणाली प्राप्त करने की उम्मीद है, जो लागू होगा कई अलग-अलग सालाना पृष्ठों के लिए।
आयताकार पहचान के लिए मुझे किसी भी मदद के लिए बहुत सराहना होगी।
किनारों से आकृति को खोजने के लिए कोशिश कर रहा है:
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 का उपयोग कर
किनारों पर वापस जाना और ऊर्ध्वाधर खोजने की कोशिश और क्षैतिज लाइनों
आकृति के साथ की तरह अभी भी सही आयतों को नहीं देख, मैं कर रहा हूँ कि मैं पता लगा सकता था। क्या आप मेरी सही दिशा में मदद कर सकते हैं? शायद इस कार्य को करने का एक आसान तरीका है?
आकृति अपूर्ण हैं। क्या आपने कैनी में कम दहलीज मूल्यों की कोशिश की है? इसके अलावा आप 'contourArea' के साथ छोटे आकारों को आकार के अनुसार फ़िल्टर कर सकते हैं। –
कैसे * समोच्च की सीमा बढ़ाएं और फिर सभी लंबवत और क्षैतिज रेखाओं का विस्तार करें? –