مشکل با کد کانولوشن در opencv - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

مشکل با کد کانولوشن در opencv

+1 امتیاز

سلام میخاستم کد زیر رو

 

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>

using namespace cv;

/** @function main */
int main ( int argc, char** argv )
{
  /// Declare variables
  Mat src, dst;

  Mat kernel;
  Point anchor;
  double delta;
  int ddepth;
  int kernel_size;
  char* window_name = "filter2D Demo";

  int c;

  /// Load an image
  src = imread( argv[1] );

  if( !src.data )
  { return -1; }

  /// Create window
  namedWindow( window_name, CV_WINDOW_AUTOSIZE );

  /// Initialize arguments for the filter
  anchor = Point( -1, -1 );
  delta = 0;
  ddepth = -1;

  /// Loop - Will filter the image with different kernel sizes each 0.5 seconds
  int ind = 0;
  while( true )
    {
      c = waitKey(500);
      /// Press 'ESC' to exit the program
      if( (char)c == 27 )
        { break; }

      /// Update kernel size for a normalized box filter
      kernel_size = 3 + 2*( ind%5 );
      kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);

      /// Apply filter
      filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );
      imshow( window_name, dst );
      ind++;
    }

  return 0;
}

قسمتای زیرو برام توضیخ بدین یعنی چی

/// Initialize arguments for the filter
  anchor = Point( -1, -1 );
  delta = 0;
  ddepth = -1;

/// Update kernel size for a normalized box filter
      kernel_size = 3 + 2*( ind%5 );
      kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);

      /// Apply filter
      filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );
      imshow( window_name, dst );
      ind++;

ممنون

سوال شده شهریور 6, 1393  بوسیله ی محدثه (امتیاز 121)   9 28 42
دوباره تگ گذاری شد شهریور 6, 1393 بوسیله ی مصطفی ساتکی

1 پاسخ

+3 امتیاز

در هر با با توجه به شمارنده ind میاد یک اندازه کرنل مشخص می کنه.

kernel_size = 3 + 2*( ind%5 );

بعد آن یک ماتریس به ابعد کرنل را با یک پر کرده و سپس این ماتریس را بر مساحت کرنل تقسیم می کنه جهت نرمال کردن مقادیر.

kernel = Mat::ones( kernel_size, kernel_size, CV_32F )/ (float)(kernel_size*kernel_size);

بعد آن تصویر را با کرنل نرمالیز شده کانوالو می کنه با تابع filter2D

filter2D(src, dst, ddepth , kernel, anchor, delta, BORDER_DEFAULT );

 

پاسخ داده شده شهریور 6, 1393 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
ممنون لطف کردین
فقط این  anchor = Point( -1, -1 ); واسه چیه؟
و ones چی هست؟؟؟؟؟؟؟؟؟
هر کرنل یک نقطه anchor داره که اغلب کاربردها باید این نقطه در مرکز کرنل باشه برای اینکار پارمترها را -1,-1 میدید در غیراینصورت نقطه ای که مشخص می کنید میشه anchor.
ممنون یعنی -1و-1 به معنی مرکزه؟
میشه یه منبع که اینو رو کامل گفته بگین؟؟؟؟؟؟؟
توی manual خود OpenCV توضیح داده شده.
ones یک ماتریس میسازه که همه ی عناصر اش ۱هستش .
...