как найти изображение внутри изображения, которое меньше - PullRequest
0 голосов
/ 06 марта 2019

Использование emgucv c # ...

Я хочу найти изображение объекта, находящегося внутри другого изображения.

Чтобы проверить мой код, я обрезаю изображение, которое ищу вИсходное изображение и сохраните его как Template.jpg.

Затем я использую эту процедуру, которая находит шаблонное изображение внутри исходного изображения:

private Point Detect_object(
    Image<Gray, Byte> Area_Image,
    Image<Gray, Byte> image_object )
{
    //Work out padding array size
    Point dftSize = new Point( Area_Image.Width + ( image_object.Width * 2 ), Area_Image.Height + ( image_object.Height * 2 ) );
    //Pad the Array with zeros
    using ( var pad_array = new Image<Gray, Byte>( dftSize.X, dftSize.Y ) )
    {
        //copy centre
        pad_array.ROI = new Rectangle( image_object.Width, image_object.Height, Area_Image.Width, Area_Image.Height );
        CvInvoke.cvCopy( Area_Image, pad_array, IntPtr.Zero );

        pad_array.ROI = ( new Rectangle( 0, 0, dftSize.X, dftSize.Y ) );

        //Match Template
        using ( var result_Matrix = pad_array.MatchTemplate( image_object, TemplateMatchingType.CcoeffNormed ) )
        {
            Point[] MAX_Loc, Min_Loc;
            double[] min, max;
            //Limit ROI to look for Match

            result_Matrix.ROI = new Rectangle( image_object.Width, image_object.Height, Area_Image.Width - image_object.Width, Area_Image.Height - image_object.Height );

            result_Matrix.MinMax( out min, out max, out Min_Loc, out MAX_Loc );

            _location = new Point( ( MAX_Loc[ 0 ].X ), ( MAX_Loc[ 0 ].Y ) );
            var Results = result_Matrix.Convert<Gray, Double>();
            return _location;
        }
    }
}

и вызываю это с помощью:

Image<Bgr, Byte> My_Image = new Image<Bgr, Byte>("d:\\original.jpg");
Image<Gray, Byte> My_Image_Gray = My_Image.Convert<Gray, Byte>();
Image<Gray, Byte> Template = new Image<Gray, Byte>("d:\\template.jpg");
var pt = Detect_object( My_Image_Gray, Template );
My_Image.Draw(new CircleF(new PointF(pt.X, pt.Y), 10), new Bgr(0, 0, 255));
My_Image.Save("D:\\result.jpg");

Теперь это работает нормально.

Итак, я подумал, что если бы у меня было несколько шаблонов под разными углами и освещением и т. Д., Я мог бы попытаться сделать свой собственный классификатор (каким-то образом - мне нужно изучитьhow)

Но сначала я подумал, что давайте уменьшим размер исходного изображения и повторно запустим код.

На этот раз он не нашел шаблон.

Так же как и шаблонсопоставление сделано по размеру?Если да, то какие еще методы я могу изучить?

спасибо

...