سؤال

بالنظر إلى كائن على خلفية بيضاء عادية، هل يعرف أي شخص ما إذا كان OpenCV يوفر وظيفة لاكتشاف كائن بسهولة من إطار تم التقاطه؟

أحاول تحديد نقاط الزاوية/المركز لكائن ما (المستطيل).الطريقة التي أفعل بها ذلك حاليًا هي بالقوة الغاشمة (مسح الصورة بحثًا عن الكائن) وليست دقيقة.أتساءل عما إذا كانت هناك وظيفة تحت الغطاء لست على علم بها.

عدل التفاصيل:الحجم تقريبًا نفس علبة الصودا الصغيرة.يتم وضع الكاميرا فوق الكائن لإضفاء طابع ثنائي الأبعاد/مستطيل عليه.الاتجاه/الزاوية من الكاميرا عشوائية، ويتم حسابها من نقاط الزاوية.

إنها مجرد خلفية بيضاء، مع الكائن عليها (أسود).تتعلق جودة اللقطة بما تتوقع رؤيته من كاميرا ويب Logitech.

بمجرد أن أحصل على نقاط الزاوية، أقوم بحساب المركز.ثم يتم تحويل النقطة المركزية إلى سنتيمترات.

إن تحسين "كيفية" حصولي على تلك الزوايا الأربع هو ما أحاول التركيز عليه.يمكنك رؤية طريقة القوة الغاشمة الخاصة بي بهذه الصورة: صورة

هل كانت مفيدة؟

المحلول

وهناك بالفعل مثال عن كيفية القيام كشف المستطيل في مكتبة برمجية مفتوحة للرؤية الحاسوبية (انظر في عينات / squares.c)، وانها بسيطة جدا، في الواقع.

وهنا الخوارزمية الخام التي يستخدمونها:

0. rectangles <- {}
1. image <- load image
2. for every channel:
2.1  image_canny <- apply canny edge detector to this channel
2.2  for threshold in bunch_of_increasing_thresholds:
2.2.1   image_thresholds[threshold] <- apply threshold to this channel
2.3  for each contour found in {image_canny} U image_thresholds:
2.3.1   Approximate contour with polygons
2.3.2   if the approximation has four corners and the angles are close to 90 degrees.
2.3.2.1    rectangles <- rectangles U {contour}

وليس على الترجمة الدقيقة لماذا يفعلون، ولكن ينبغي أن تساعدك.

نصائح أخرى

وآمل أن يساعد هذا، يستخدم الأسلوب حظة للحصول على النقطه الوسطى من صورة بالأبيض والأسود.

cv::Point getCentroid(cv::Mat img)
{
    cv::Point Coord;
    cv::Moments mm = cv::moments(img,false);
    double moment10 = mm.m10;
    double moment01 = mm.m01;
    double moment00 = mm.m00;
    Coord.x = int(moment10 / moment00);
    Coord.y = int(moment01 / moment00);
    return Coord;
}

يحتوي OpenCV على عدد كبير من الوظائف التي يمكن أن تساعدك في تحقيق ذلك.قم بتنزيل Emgu.CV لـ C#.NET ملفوفًا في المكتبة إذا كنت تقوم بالبرمجة بهذه اللغة.

بعض الطرق للحصول على ما تريد:

  1. ابحث عن الزوايا كما كان من قبل - على سبيل المثال.وظيفة OpenCV "CornerHarris".

  2. عتبة الصورة وحساب مركز الثقل - انظر http://www.roborealm.com/help/Center%20of%20Gravity.php ...هذه هي الطريقة التي سأستخدمها.يمكنك حتى تنفيذ العتبة في روتين COG.أي.cog_x += *imagePtr < 128 ؟255 :0;

  3. ابحث عن لحظات الصورة لإعطاء الدوران ومركز الثقل وما إلى ذلك - على سبيل المثال.وظيفة "لحظات" OpenCV.(لم أستخدم هذا)

  4. (تحرير) تحتوي مكتبة AForge.NET على وظائف اكتشاف الزوايا بالإضافة إلى مثال لمشروع (MotionDetector) ومكتبات للاتصال بكاميرات الويب.أعتقد أن هذه ستكون الطريقة الأسهل، بافتراض أنك تستخدم Windows و.NET.

وعادة ما يطلق عليه تحليل سائل في المكتبات رؤية آلة أخرى. أنا لم تستخدم مكتبة برمجية مفتوحة للرؤية الحاسوبية حتى الان.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top