Возможно ли использовать изображение в картинке с помощью OpenCV? - PullRequest
1 голос
/ 17 июня 2011

Я хотел бы добавить изображение меньшего размера поверх изображения большего размера (в конечном итоге для PiP в видеопотоке).Я могу сделать это, просматривая соответствующее свойство данных в большом изображении и добавляя пиксели из маленького изображения.Но есть ли более простой и аккуратный способ?Я использую EMGU.

Моя идея состояла в том, чтобы определить ROI для большого изображения того же размера, что и маленькое изображение.Установите Большое изображение равным маленькому изображению, а затем просто удалите РИ.Т.е. в псевдокоде:

Large.ROI = rectangle defined by small image;

Large = Small;

Large.ROI = Rectangle.Empty;

Однако это не работает и большое изображение не меняется.Любые предложения будут высоко оценены.

Большое изображение:
Large Image

Маленькое изображение:
Small Image

Желаемый результат:
Desired Result

Ответы [ 4 ]

4 голосов
/ 02 июля 2012

Если вы используете C ++ API, должен работать следующий фрагмент кода:

cv::Mat big;
cv::Mat small;

// Define roi area (it has small image dimensions). 
cv::Rect roi = cv::Rect(50,50, small.cols, small.rows);

// Take a sub-view of the large image
cv::Mat subView = big(roi); 

// Copy contents of the small image to large
small.copyTo(subView); 

Старайтесь не выходить за рамки большого изображения.

1 голос
/ 18 июля 2013

Не знаю, поможет ли это, я не использовал эмгу.Однако так я смог сделать изображение в изображении с помощью opencv.

drawIntoArea(Mat &src, Mat &dst, int x, int y, int width, int height)
{
    Mat scaledSrc;
    // Destination image for the converted src image.
    Mat convertedSrc(src.rows,src.cols,CV_8UC3, Scalar(0,0,255));

    // Convert the src image into the correct destination image type
    // Could also use MixChannels here.
    // Expand to support range of image source types.
    if (src.type() != dst.type())
    {
        cvtColor(src, convertedSrc, CV_GRAY2RGB);
    }else{
        src.copyTo(convertedSrc);
    }

    // Resize the converted source image to the desired target width.
    resize(convertedSrc, scaledSrc,Size(width,height),1,1,INTER_AREA);

    // create a region of interest in the destination image to copy the newly sized and converted source image into.
    Mat ROI = dst(Rect(x, y, scaledSrc.cols, scaledSrc.rows));
    scaledSrc.copyTo(ROI);
}
0 голосов
/ 13 декабря 2018

На основании ответа @ BloodAxe, используя EMGU 3.4, работает:

// Define roi area (it has small image dimensions). 
var ROI = new System.Drawing.Rectangle(100, 500, 200, 200)

// Take a sub-view of the large image
Mat subView = new Mat(bigImage, ROI);

// Copy contents of the small image to large
small.CopyTo(subView);
0 голосов
/ 14 июля 2011

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

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

Улучшенный метод - добавить еще один элемент управления. Фактически у вас есть окно видеопотока, показывающее увеличенное изображение на заднем плане и меньший элемент управления сверху, отображающий уменьшенное изображение. В действительности вы можете иметь столько маленьких элементов управления, сколько захотите. Фактически вы будете отображать два изображения или видеопотока в двух разных элементах управления (например, в полях с изображениями). Поскольку у вас есть для этого код, все, что вам нужно будет сделать, это убедиться в том, в каком порядке отображаются ваши элементы управления.

Я предположил, что вы не программируете вывод в консольное окно. Если вам нужна дополнительная помощь, пожалуйста, не стесняйтесь спрашивать.

Что касается комментариев, EMGU написан на C #, и, несмотря на ваше мнение о том, что вы не должны вызывать EMGU OpenCV, почему он не должен быть помечен как вопрос, ориентированный на OpenCV. Ведь EMGU - это просто библиотека OpenCV с оберткой c #. Я нашел много ресурсов по OpenCV, полезных для EMGU и наоборот.

Приветствие Chris

...