ফটোতে কাগজের শীটের কোণগুলি সনাক্ত করতে অ্যালগরিদম


102

কোনও ছবিতে চালান / রসিদ / পত্রকের কাগজের কোণগুলি সনাক্ত করার সর্বোত্তম উপায় কী? ওসিআরের আগে এটি পরবর্তী দৃষ্টিভঙ্গি সংশোধনের জন্য ব্যবহার করতে হবে।

আমার বর্তমান পদ্ধতিটি হ'ল:

আরজিবি> ধূসর> প্রান্তিককরণের সাথে ক্যানি এজ সনাক্তকরণ> ডায়াল্ট (1)> ছোট বস্তুগুলি সরিয়ে ফেলুন (6)> সাফ বোর্ডার অবজেক্টস> উত্তল ক্ষেত্রের উপর ভিত্তি করে লার্জগুলি ব্লগ চয়ন করুন। > [কোণ সনাক্তকরণ - প্রয়োগ করা হয়নি]

আমি সাহায্য করতে পারি না তবে এই ধরণের বিভাজনকে পরিচালনা করার জন্য আরও শক্তিশালী 'বুদ্ধিমান' / পরিসংখ্যানিক পদ্ধতির অবশ্যই থাকতে হবে বলে মনে করি। আমার কাছে প্রচুর প্রশিক্ষণের উদাহরণ নেই তবে আমি একসাথে 100 টি চিত্র পেতে পারি।

বৃহত্তর প্রেক্ষাপটে:

আমি প্রোটোটাইপে ম্যাটল্যাব ব্যবহার করছি এবং ওপেনসিভি এবং টেসারেক্ট-ওসিআরটিতে সিস্টেমটি প্রয়োগের পরিকল্পনা করছি। এই নির্দিষ্ট অ্যাপ্লিকেশনটির জন্য আমার সমাধান করা দরকার বেশ কয়েকটি চিত্র প্রক্রিয়াকরণের সমস্যাগুলির মধ্যে এটি প্রথম। সুতরাং আমি নিজের সমাধানটি রোল করতে চাইছি এবং চিত্র প্রক্রিয়াকরণ অ্যালগরিদমের সাথে নিজেকে নতুন করে পরিচিত করতে চাই।

এখানে কিছু নমুনা চিত্র যা আমি অ্যালগোরিদমটি পরিচালনা করতে চাই: আপনি যদি চ্যালেঞ্জটি গ্রহণ করতে চান তবে বড় চিত্রগুলি http://madteckhead.com/tmp এ রয়েছে

মামলা 1
(উত্স: ম্যাডটেকহেড.কম )

কেস 2
(উত্স: ম্যাডটেকহেড.কম )

কেস 3
(উত্স: ম্যাডটেকহেড.কম )

কেস 4
(উত্স: ম্যাডটেকহেড.কম )

সেরা ক্ষেত্রে এটি দেয়:

কেস 1 - ক্যানি
(উত্স: ম্যাডটেকহেড.কম )

কেস 1 - পোস্ট ক্যানি
(উত্স: ম্যাডটেকহেড.কম )

কেস 1 - বৃহত্তম ব্লগ
(উত্স: ম্যাডটেকহেড.কম )

তবে এটি অন্যান্য ক্ষেত্রে সহজেই ব্যর্থ হয়:

কেস 2 - ক্যানি
(উত্স: ম্যাডটেকহেড.কম )

কেস 2 - পোস্ট ক্যানি
(উত্স: ম্যাডটেকহেড.কম )

কেস 2 - বৃহত্তম ব্লগ
(উত্স: ম্যাডটেকহেড.কম )

সমস্ত দুর্দান্ত ধারণা জন্য আগাম ধন্যবাদ! আমি খুব ভালবাসী!

সম্পাদনা: হালকা রূপান্তর অগ্রগতি

প্রশ্ন: কোন আলগোরিদিম কোণগুলি খুঁজে পেতে খড় লাইনগুলি গুচ্ছ করবে? উত্তরগুলির পরামর্শ অনুসরণ করে আমি হফ ট্রান্সফর্মটি ব্যবহার করতে, লাইনগুলি বাছতে এবং সেগুলি ফিল্টার করতে সক্ষম হয়েছি। আমার বর্তমান পদ্ধতির বদলে অপরিশোধিত। আমি ধরে নিয়েছি চালানটি সর্বদা চিত্রের সাথে সারিবদ্ধ হওয়ার চেয়ে কম 15 ডিগ্রির চেয়ে কম হবে। আমি লাইনগুলির জন্য যুক্তিসঙ্গত ফলাফল দিয়ে শেষ করি যদি এটি হয় (নীচে দেখুন)। তবে কোণগুলির জন্য বহির্মুখের জন্য লাইনগুলি (বা ভোট) ক্লাস্টার করার জন্য উপযুক্ত অ্যালগরিদম সম্পর্কে সম্পূর্ণ নিশ্চিত নই। হুফ লাইনগুলি অবিচ্ছিন্ন নয়। এবং কোলাহলপূর্ণ চিত্রগুলিতে সমান্তরাল রেখা থাকতে পারে তাই লাইন অরিজিন মেট্রিক থেকে কিছু ফর্ম বা দূরত্বের প্রয়োজন। কোন ধারনা?

মামলা 1 কেস 2 কেস 3 কেস 4
(উত্স: ম্যাডটেকহেড.কম )


4
হ্যাঁ, আমি প্রায় 95% ক্ষেত্রে এটি কাজ করতে পেরেছি। সময়ের অভাবের কারণে আমার তখন থেকে কোডটি শেলফ করতে হয়েছিল। আমি কোনও পর্যায়ে একটি ফলোআপ পোস্ট করব, যদি আপনার জরুরি সহায়তার প্রয়োজন হয় তবে আমাকে নির্দ্বিধায় যোগাযোগ করুন। ভাল ফলোআপ অভাবের জন্য দুঃখিত। আমি এই বৈশিষ্ট্যটিতে কাজ করতে ফিরে আসতে চাই।
নাথান কেলার

নাথন, আপনি কীভাবে এটি শেষ করে শেষ করতে পারেন দয়া করে একটি ফলোআপ পোস্ট করতে পারেন? আমি কাগজের পত্রকের কোণার / আউটটার-কনট্যুরকে স্বীকৃতি দিয়ে একই পয়েন্টে আটকেছি। আপনার ঠিক যেমন সমস্যা হয়েছে আমিও ঠিক তেমন সমস্যার সমাধান করেছি কারণ আমি কোনও সমাধানে আগ্রহী।
টিম

6
এই পোস্টে সমস্ত চিত্র এখন
404.

উত্তর:


29

আমি মার্টিনের বন্ধু যিনি এই বছরের শুরুতে এটি নিয়ে কাজ করছিলেন। এটি আমার প্রথম কোডিং প্রকল্প ছিল, এবং কিন্ডা কিছুটা ভিড়ের মধ্যেই শেষ হয়েছিল, সুতরাং কোডটির কিছুটা ভুল প্রয়োজন ... ডিকোডিং ... আমি আপনাকে ইতিমধ্যে যা করতে দেখেছি তার থেকে কয়েকটি টিপস দেব এবং তারপরে আগামীকাল আমার ছুটিতে আমার কোডটি সাজান।

প্রথম টিপ, OpenCVএবং pythonদুর্দান্ত, যত তাড়াতাড়ি সম্ভব তাদের কাছে যান। : ডি

ছোট ছোট অবজেক্ট এবং বা শব্দ বাদ দেওয়ার পরিবর্তে ক্যানির নিয়ন্ত্রণগুলি কম করুন, সুতরাং এটি আরও কিনারা গ্রহণ করে এবং তারপরে বৃহত্তম বদ্ধ কনট্যুরটি খুঁজে পান ( findcontour()কিছু সাধারণ পরামিতি সহ ওপেনসিভি ব্যবহারে , আমি মনে করি যে আমি ব্যবহার করেছি CV_RETR_LIST)। এটি কোনও কাগজের সাদা টুকরোতে থাকা অবস্থায় এখনও লড়াই করতে পারে তবে অবশ্যই সেরা ফলাফল সরবরাহ করেছিল।

জন্য Houghline2()ট্রান্সফর্ম সঙ্গে চেষ্টা CV_HOUGH_STANDARDউল্টোদিকে CV_HOUGH_PROBABILISTIC, এটা হবে দিতে Rho এবং থেটা মূল্যবোধ, মেরু স্থানাঙ্ক লাইন সংজ্ঞায়িত, এবং তারপরে আপনি গ্রুপ করতে পারেন যারা একটি নির্দিষ্ট সহনশীলতা মধ্যে লাইন।

আমার গ্রুপিংটি লুক আপ টেবিল হিসাবে কাজ করেছে, খড় থেকে রূপান্তরিত প্রতিটি লাইনের জন্য এটি একটি rho এবং থেটা জুটি দেবে। যদি এই মানগুলি মধ্যে থাকে তবে টেবিলের এক জোড়া মানের 5% বলুন, এগুলি বাতিল করা হয়েছে, যদি তারা 5% এর বাইরে থাকে, তবে টেবিলে একটি নতুন এন্ট্রি যুক্ত করা হয়েছিল।

এরপরে আপনি সমান্তরাল রেখাগুলি বা লাইনগুলির মধ্যে দূরত্বের বিশদটি আরও সহজেই করতে পারেন।

আশাকরি এটা সাহায্য করবে.


হাই ড্যানিয়েল, জড়িত থাকার জন্য ধন্যবাদ। আমি তোমার কাছে যেতে পছন্দ করি এই মুহুর্তে এটির সত্যিকারের রুটটি ভাল ফলাফল পাচ্ছে। আয়তক্ষেত্রগুলি সনাক্ত করে এমন কি ওপেনসিভি উদাহরণ ছিল detected ফলাফলগুলিতে কেবল কিছু ফিল্টারিং করতে হয়েছিল। যেহেতু আপনি বলছিলেন যে সাদা রঙের সাদাটি এই পদ্ধতির সাথে সনাক্ত করা কঠিন। তবে এটি হুফের চেয়ে সহজ এবং ব্যয়বহুল পদ্ধতির ছিল। আমি প্রকৃতপক্ষে আমার আলগো থেকে খড়ের পদ্ধতির বাইরে চলে এসেছি এবং একটি পলি অনুমানের কাজটি করেছি, ওপেনসিভিতে বর্গের উদাহরণটি দেখুন। আমি আপনার দাপট ভোট প্রয়োগ বাস্তবায়ন দেখতে চাই। অগ্রিম ধন্যবাদ, নাথান
নাথান কেলার

এই পদ্ধতির সাথে আমার সমস্যা ছিল, আমি যদি ভবিষ্যতের রেফারেন্সের জন্য আরও ভাল কিছু পরিকল্পনা করতে পারি তবে আমি একটি সমাধান পোস্ট করব
অঙ্কুশুমান কুমার

@ অংশুমান কুমার এই প্রশ্নটির সাথে আমার সত্যিই সাহায্যের প্রয়োজন, দয়া করে আপনি আমাকে সাহায্য করতে পারবেন? stackoverflow.com/questions/61216402/…
কার্লোস ডিয়েগো

19

আমার বিশ্ববিদ্যালয়ের একটি ছাত্র দল সম্প্রতি একটি আইফোন অ্যাপ্লিকেশন (এবং পাইথন ওপেনসিভি অ্যাপ্লিকেশন) প্রদর্শন করেছে যা তারা ঠিক এটি করার জন্য লিখেছিল। আমার মনে আছে, পদক্ষেপগুলি এইরকম কিছু ছিল:

  • কাগজের টেক্সটটি পুরোপুরি সরিয়ে ফেলার জন্য মিডিয়ান ফিল্টার (এটি বেশ ভাল আলো সহ সাদা কাগজে হাতে লেখা লিখিত পাঠ্য ছিল এবং এটি মুদ্রিত পাঠ্যের সাথে কাজ করতে পারে না, এটি খুব ভালভাবে কাজ করেছিল)। কারণটি ছিল এটি কোণার সনাক্তকরণকে আরও সহজ করে তোলে।
  • লাইনগুলির জন্য হার্ড ট্রান্সফর্ম
  • হাফ ট্রান্সফর্ম সংযোজক স্পেসে শিখরগুলি সন্ধান করুন এবং পুরো চিত্র জুড়ে প্রতিটি লাইন আঁকুন।
  • রেখাগুলি বিশ্লেষণ করুন এবং একে অপরের খুব কাছাকাছি অবস্থিত এবং একই ধরণের কোণে (লাইনগুলি একটিকে ক্লাস্টার করুন) মুছে ফেলুন। এটি প্রয়োজনীয় কারণ হফ ট্রান্সফর্মটি নিখুঁত না হওয়ায় এটি একটি পৃথক নমুনা স্থানে কাজ করে।
  • লাইনগুলির যুগল সন্ধান করুন যা প্রায় সমান্তরাল এবং কোন লাইনগুলি কোয়াড তৈরি করে তা দেখতে অন্যান্য জোড়া ছেদ করে।

এটি মোটামুটি ভালভাবে কাজ করেছে বলে মনে হয়েছিল এবং তারা কাগজের কোনও টুকরো বা বইয়ের একটি ছবি তুলতে, কোণ সনাক্তকরণ করতে সক্ষম হয়েছিল এবং তারপরে চিত্রটিতে নথিটি প্রায় রিয়েলটাইমে ফ্ল্যাট প্লেনে ম্যাপ করতে সক্ষম হয়েছিল (সঞ্চালনের জন্য একটি একক ওপেনসিভি ফাংশন ছিল ম্যাপিং)। আমি এটি কাজ করতে দেখে কোনও ওসিআর ছিল না।


মার্টিন দুর্দান্ত ধারণা জন্য ধন্যবাদ। Ive আপনার পরামর্শ গ্রহণ করেছে এবং Hough রূপান্তর পদ্ধতির প্রয়োগ। (উপরে ফলাফল দেখুন)। আমি একটি শক্তিশালী অ্যালগরিদম নির্ধারণের জন্য সংগ্রাম করছি যা ছেদগুলি সন্ধান করার জন্য লাইনগুলি বহির্মুখী করবে। এখানে অনেকগুলি লাইন নেই এবং কয়েকটি মিথ্যা ধনাত্মক। আমি কীভাবে সর্বোত্তমভাবে সংহত এবং লাইনগুলি বাতিল করতে পারি সে সম্পর্কে আপনার কোনও পরামর্শ আছে? আপনার শিক্ষার্থীরা যদি আগ্রহী হন তবে দয়া করে তাদের যোগাযোগের জন্য উত্সাহ দিন। আমি একটি মোবাইল প্ল্যাটফর্মে চালানোর জন্য অ্যালগরিদমগুলি পেতে তাদের অভিজ্ঞতাগুলি শুনতে আগ্রহী। (এটি আমার পরবর্তী লক্ষ্য) আপনার ধারণার জন্য অনেক ধন্যবাদ।
নাথন কেলার

4
দেখে মনে হচ্ছে এইচটি জন্য রেখাগুলি আপনার দ্বিতীয় চিত্র ব্যতীত সকলের পক্ষে ভালভাবে কাজ করেছে, তবে আপনি কি সঞ্চয়ের ক্ষেত্রে আপনার শুরু এবং শেষের মানগুলির জন্য একটি প্রান্তিক সহনশীলতার সংজ্ঞা দিচ্ছেন? এইচটি সত্যিকার অর্থে শুরু এবং শেষের অবস্থানগুলি সংজ্ঞায়িত করে না, বরং y = mx + c এর m এবং c এর মান। এখানে দেখুন - নোট করুন যে এটি কার্টেসিয়ানের পরিবর্তে সঞ্চয়ের মধ্যে মেরু স্থানাঙ্ক ব্যবহার করছে। এই পদ্ধতিতে আপনি লাইনগুলি সি দ্বারা এবং তারপরে মি দ্বারা গোষ্ঠী করতে পারেন যাতে সেগুলি পাতলা করতে এবং লাইনগুলি পুরো চিত্র জুড়ে প্রসারিত হিসাবে কল্পনা করে আপনি আরও কার্যকর ছেদ দেখতে পাবেন।
মার্টিন ফুট

@ মার্টিনফুট আমি এই প্রশ্নের সাথে সত্যই সাহায্যের প্রয়োজন, আপনি কি আমাকে সাহায্য করতে পারেন দয়া করে? stackoverflow.com/questions/61216402/…
কার্লোস ডিয়েগো

16

কিছুটা পরীক্ষা-নিরীক্ষার পরে আমি এখানে কী নিয়ে এসেছি:

import cv, cv2, numpy as np
import sys

def get_new(old):
    new = np.ones(old.shape, np.uint8)
    cv2.bitwise_not(new,new)
    return new

if __name__ == '__main__':
    orig = cv2.imread(sys.argv[1])

    # these constants are carefully picked
    MORPH = 9
    CANNY = 84
    HOUGH = 25

    img = cv2.cvtColor(orig, cv2.COLOR_BGR2GRAY)
    cv2.GaussianBlur(img, (3,3), 0, img)


    # this is to recognize white on white
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(MORPH,MORPH))
    dilated = cv2.dilate(img, kernel)

    edges = cv2.Canny(dilated, 0, CANNY, apertureSize=3)

    lines = cv2.HoughLinesP(edges, 1,  3.14/180, HOUGH)
    for line in lines[0]:
         cv2.line(edges, (line[0], line[1]), (line[2], line[3]),
                         (255,0,0), 2, 8)

    # finding contours
    contours, _ = cv2.findContours(edges.copy(), cv.CV_RETR_EXTERNAL,
                                   cv.CV_CHAIN_APPROX_TC89_KCOS)
    contours = filter(lambda cont: cv2.arcLength(cont, False) > 100, contours)
    contours = filter(lambda cont: cv2.contourArea(cont) > 10000, contours)

    # simplify contours down to polygons
    rects = []
    for cont in contours:
        rect = cv2.approxPolyDP(cont, 40, True).copy().reshape(-1, 2)
        rects.append(rect)

    # that's basically it
    cv2.drawContours(orig, rects,-1,(0,255,0),1)

    # show only contours
    new = get_new(img)
    cv2.drawContours(new, rects,-1,(0,255,0),1)
    cv2.GaussianBlur(new, (9,9), 0, new)
    new = cv2.Canny(new, 0, CANNY, apertureSize=3)

    cv2.namedWindow('result', cv2.WINDOW_NORMAL)
    cv2.imshow('result', orig)
    cv2.waitKey(0)
    cv2.imshow('result', dilated)
    cv2.waitKey(0)
    cv2.imshow('result', edges)
    cv2.waitKey(0)
    cv2.imshow('result', new)
    cv2.waitKey(0)

    cv2.destroyAllWindows()

নিখুঁত নয়, তবে কমপক্ষে সমস্ত নমুনার জন্য কাজ করে:

ঘ ঘ ঘ ঘ


4
আমি একই প্রকল্পে কাজ করছি। আমি কোডের উপরে চলেছি এবং এটি আমাকে "সিভি নামে কোনও মডিউল" ত্রুটি দেয় না। আমি ওপেন সিভি 2.4 সংস্করণ ইনস্টল করেছি এবং সিভি 2 আমদানি আমার জন্য নিখুঁতভাবে কাজ করছে।
নবনিত সিং

আপনি কি এই কোডটি আপডেট করার পক্ষে যথেষ্ট সদয় হতে পারেন তাই এটি কাজ করে? পেস্টবিন.com/পিএমএইচ 5 ওয়াইএমএম এটি আমাকে একটি কালো পৃষ্ঠা দেয়।
the7erm

নিম্নলিখিত কোডটি জাভাতে কীভাবে রূপান্তর করা যায় সে সম্পর্কে আপনার কোনও ধারণা আছে: for line in lines[0]: cv2.line(edges, (line[0], line[1]), (line[2], line[3]), (255,0,0), 2, 8) # finding contours contours, _ = cv2.findContours(edges.copy(), cv.CV_RETR_EXTERNAL, cv.CV_CHAIN_APPROX_TC89_KCOS) contours = filter(lambda cont: cv2.arcLength(cont, False) > 100, contours) contours = filter(lambda cont: cv2.contourArea(cont) > 10000, contours)
অরেলিয়ানার

ভানুয়ান আমি এই প্রশ্নের সাথে সত্যই সাহায্যের প্রয়োজন, আপনি আমাকে সাহায্য করতে পারেন, দয়া করে? stackoverflow.com/questions/61216402/…
কার্লোস ডিয়েগো

9

প্রান্ত সনাক্তকরণ থেকে শুরু করার পরিবর্তে আপনি কর্নার সনাক্তকরণ ব্যবহার করতে পারেন।

মারভিনভিন ফ্রেমওয়ার্ক এই উদ্দেশ্যে মোরাভেক অ্যালগোরিদমের একটি বাস্তবায়ন সরবরাহ করে। আপনি একটি সূচনা পয়েন্ট হিসাবে কাগজগুলির কোণগুলি খুঁজে পেতে পারেন। মোরাভেকের অ্যালগরিদমের আউটপুট নীচে:

এখানে চিত্র বর্ণনা লিখুন


4

এছাড়াও আপনি চিত্রের স্থিতিশীল অঞ্চলগুলি সন্ধান করতে সোবেল অপারেটরের ফলাফলের উপর এমএসআর (সর্বাধিক স্থিতিশীল এক্সটরমাল অঞ্চলগুলি) ব্যবহার করতে পারেন । এমএসইআর দ্বারা প্রত্যাবর্তিত প্রতিটি অঞ্চলের জন্য আপনি এই জাতীয় কিছু পাওয়ার জন্য উত্তল হাল এবং পলি অনুমানের প্রয়োগ করতে পারেন:

তবে এই ধরণের সনাক্তকরণ কোনও চিত্রের চেয়ে বেশি লাইভ সনাক্তকরণের জন্য দরকারী যা সর্বদা সেরা ফলাফলটি দেয় না।

ফলাফল


4
আপনি সম্ভবত কিছু কোডের জন্য আরও কিছু বিবরণ ভাগ করতে পারেন, অগ্রিম একটি গুচ্ছকে ধন্যবাদ
মন্টি

Cv2.CHAIN_APPROX_SIMPLE এ আমি একটি ত্রুটি পেয়েছি যাতে আনপ্যাক করার জন্য অনেকগুলি মান বলা হচ্ছে। কোন ধারণা? আমি আমার নমুনা হিসাবে 1024 * 1024 চিত্র ব্যবহার করছি
প্রবীণ

4
ধন্যবাদ, শুধু বর্তমান Opencv শাখায় বাক্য গঠন পরিবর্তন মূর্ত আউট answers.opencv.org/question/40329/...
প্রভীন

এমএসইআর বলতে কি ব্লবগুলি বের করে বোঝানো হয় না? আমি চেষ্টা করে দেখেছি এবং এটি বেশিরভাগ
পাঠ্যকেই

3

প্রান্ত সনাক্তকরণের পরে, হফ ট্রান্সফর্ম ব্যবহার করুন। তারপরে, তাদের লেবেলগুলির সাথে এই পয়েন্টগুলি একটি এসভিএম (সমর্থনকারী ভেক্টর মেশিনে) রাখুন, উদাহরণগুলিতে যদি মসৃণ রেখা থাকে, এসভিএমকে উদাহরণের প্রয়োজনীয় অংশগুলি এবং অন্যান্য অংশগুলি ভাগ করতে কোনও অসুবিধা হবে না। এসভিএম সম্পর্কে আমার পরামর্শ, সংযোগ এবং দৈর্ঘ্যের মতো একটি প্যারামিটার রাখুন। এটি হ'ল, যদি পয়েন্টগুলি সংযুক্ত এবং দীর্ঘ হয় তবে সেগুলি প্রাপ্তির একটি লাইন হতে পারে। তারপরে, আপনি অন্যান্য পয়েন্টগুলি মুছতে পারেন।


হাই আরেস, আপনার ধারণার জন্য ধন্যবাদ! আমি হাফ রূপান্তর বাস্তবায়ন করেছি (উপরে দেখুন)। মিথ্যা ধনাত্মক এবং অব্যাহত লাইন দেওয়া কোণগুলি খুঁজে পাওয়ার জন্য আমি একটি শক্তিশালী উপায়ে কাজ করতে পারি না। আপনার আরও কিছু ধারণা আছে? এসভিএম কৌশলগুলির দিকে তাকিয়ে কিছুক্ষণ হয়েছে। এটি কি তত্ত্বাবধানের পদ্ধতি? আমার কাছে কোনও প্রশিক্ষণের ডেটা নেই তবে আমি কিছু তৈরি করতে পারি। এসভিএম সম্পর্কে আরও জানতে আগ্রহী হিসাবে আমি পদ্ধতির অন্বেষণে আগ্রহী হব। আপনি কোন সংস্থান প্রস্তাব দিতে পারেন। আন্তরিক শুভেচ্ছা. নাথান
নাথান কেলার

2

আপনি এখানে সিভিল ব্যবহার করে @ ভানুয়ান এর কোড পাবেন:

cv::cvtColor(mat, mat, CV_BGR2GRAY);
cv::GaussianBlur(mat, mat, cv::Size(3,3), 0);
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Point(9,9));
cv::Mat dilated;
cv::dilate(mat, dilated, kernel);

cv::Mat edges;
cv::Canny(dilated, edges, 84, 3);

std::vector<cv::Vec4i> lines;
lines.clear();
cv::HoughLinesP(edges, lines, 1, CV_PI/180, 25);
std::vector<cv::Vec4i>::iterator it = lines.begin();
for(; it!=lines.end(); ++it) {
    cv::Vec4i l = *it;
    cv::line(edges, cv::Point(l[0], l[1]), cv::Point(l[2], l[3]), cv::Scalar(255,0,0), 2, 8);
}
std::vector< std::vector<cv::Point> > contours;
cv::findContours(edges, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_TC89_KCOS);
std::vector< std::vector<cv::Point> > contoursCleaned;
for (int i=0; i < contours.size(); i++) {
    if (cv::arcLength(contours[i], false) > 100)
        contoursCleaned.push_back(contours[i]);
}
std::vector<std::vector<cv::Point> > contoursArea;

for (int i=0; i < contoursCleaned.size(); i++) {
    if (cv::contourArea(contoursCleaned[i]) > 10000){
        contoursArea.push_back(contoursCleaned[i]);
    }
}
std::vector<std::vector<cv::Point> > contoursDraw (contoursCleaned.size());
for (int i=0; i < contoursArea.size(); i++){
    cv::approxPolyDP(Mat(contoursArea[i]), contoursDraw[i], 40, true);
}
Mat drawing = Mat::zeros( mat.size(), CV_8UC3 );
cv::drawContours(drawing, contoursDraw, -1, cv::Scalar(0,255,0),1);

লাইন পরিবর্তনশীল সংজ্ঞা কোথায়? স্টাড :: ভেক্টর <সিভি :: ভেক 4 আই> লাইন অবশ্যই হবে;

@ ক্যানেরেক আপনি ঠিক বলেছেন std::vector<cv::Vec4i> lines;আমার প্রকল্পের একটি বিশ্বব্যাপী ঘোষণা করা হয়।
GBF_Gabriel

আরে @ জিবিএফ_ গ্যাব্রিয়েল, আপনি কী দয়া করে বলতে পারবেন কীভাবে অঙ্কন রেখাগুলির পরিবর্তে প্রয়োজনীয় চিত্রের চারটি কোণ বা প্রান্তটি খুঁজে পাওয়া যায়।
আকাশ চৌধুরী চৌধুরী

CvDrawContours মধ্যে বিবৃতি ব্যর্থ হয়েছে আমি এই ত্রুটি ই / সিভি :: ত্রুটি () পাচ্ছি: OpenCV (4.3.0) ত্রুটি (reader.ptr = শূন্য!)
আকাশ চৌধুরীর

1
  1. ল্যাব স্পেসে রূপান্তর করুন

  2. Kmeans বিভাগ 2 ক্লাস্টার ব্যবহার করুন

  3. তারপরে কোনও একটি ক্লাস্টারে কনট্যুর বা হাফ ব্যবহার করুন (উদ্দেশ্যমূলক)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.