Изменить размер изображениябез масштабирования.Эмгу CV - PullRequest
1 голос
/ 19 декабря 2011

Я использую Image.InRange для создания маски из изображения.Чтобы сохранить максимальную производительность, я использую Image.ROI для обрезки изображения и до использования метода InRange.Для того, чтобы на самом деле работать с изображением, мне нужно, чтобы оно имело те же размеры, что и оригинал, но все, что для меня очевидно, - это как масштабировать изображение, а не изменять размеры, сохраняя изображение.

Вот этот код:

public Image<Gray, byte> Process(Image<Bgr, byte> frameIn, Rectangle roi)
    {
        Image<Bgr, byte> rectFrame = null;
        Image<Gray, byte> mask = null;
        if (roi != Rectangle.Empty)
        {
            rectFrame = frameIn.Copy(roi);
        }
        else
        {
            rectFrame = frameIn;
        }

        if (Equalize)
        {
            rectFrame._EqualizeHist();
        }


        mask = rectFrame.InRange(minColor, maxColor);

        mask ._Erode(Iterations);
        mask ._Dilate(Iterations);

        if (roi != Rectangle.Empty)
        {
            //How do I give the image its original dimensions?
        }

        return mask;
    }

Спасибо, Крис

1 Ответ

1 голос
/ 19 декабря 2011

Я предполагаю, что вы хотите вернуть маску того же размера, что и fram. Самый простой способ - скопировать маску в новое изображение того же размера, что и framIn.Вы могли бы, если ваше приложение не чувствительно ко времени, сделать маску с тем же размером framIn, установить ее ROI, а затем выполнить ваши операции.Это занимает больше времени для обработки и не является лучшей практикой.

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

if (roi != Rectangle.Empty)
{
    //Create a blank image with the correct size
    Image<Gray, byte> mask_return = new Image<Gray, byte>(frameIn.Size);
    //Set its ROI to the same as Mask and in the centre of the image (you may wish to change this)
    mask_return.ROI = new Rectangle((mask_return.Width - mask.Width) / 2, (mask_return.Height - mask.Height) / 2, mask.Width, mask.Height);
    //Copy the mask to the return image
    CvInvoke.cvCopy(mask, mask_return, IntPtr.Zero);
    //Reset the return image ROI so it has the same dimensions
    mask_return.ROI = new Rectangle(0, 0, frameIn.Width, frameIn.Height);
    //Return the mask_return image instead of the mask
    return mask_return;
}

return mask;

Надеюсь, это поможет,

Ура,

Крис

...