使用OpenCV是否可以实现画中画?

使用OpenCV是否可以实现画中画?,opencv,emgucv,roi,Opencv,Emgucv,Roi,我想在较大的图像上添加一个较小的图像(最终用于视频提要上的PiP)。我可以通过迭代大图像中的相关数据属性并添加小图像中的像素来实现。但是有没有更简单、更整洁的方法呢?我用的是EMGU 我的想法是在与小图像大小相同的大图像中定义ROI。将大图像设置为与小图像相等,然后简单地删除ROI。伪代码中的Ie: Large.ROI = rectangle defined by small image; Large = Small; Large.ROI = Rectangle.Empty; 但是,这不起

我想在较大的图像上添加一个较小的图像(最终用于视频提要上的PiP)。我可以通过迭代大图像中的相关数据属性并添加小图像中的像素来实现。但是有没有更简单、更整洁的方法呢?我用的是EMGU

我的想法是在与小图像大小相同的大图像中定义ROI。将大图像设置为与小图像相等,然后简单地删除ROI。伪代码中的Ie:

Large.ROI = rectangle defined by small image;

Large = Small;

Large.ROI = Rectangle.Empty;
但是,这不起作用,大图像也不会改变。如有任何建议,将不胜感激

大图像:

小图像:

期望结果:

我对EMGU有很多经验。据我所知,您采用的方法是在大图像中显示子图像数据的唯一直接方法。您可能需要刷新较大的图像,这会产生擦除传输数据的固有效果,并将较小的图像复制回来

虽然解决方案是可能的,但我认为这种方法是有缺陷的。所需的处理时间将影响较大可视帧中任何图像的显示速率

一种改进的方法是添加另一个控件。实际上,您的视频馈送窗口在背景中显示较大的图像,而在此窗口上方的较小控件显示较小的图像。实际上,您可以拥有任意数量的这些较小的控件。实际上,您将在两个不同的控件(例如图像框)中显示两个图像或视频源。因为您有代码来执行此操作,所以您所要做的就是确保控件的显示顺序

我假设您没有将输出编程到控制台窗口。如果你还需要帮助,请尽管问

至于评论,EMGU是用C#写的,虽然很感谢您不将EMGU称为OpenCV,但为什么不将其标记为面向OpenCV的问题呢。毕竟,EMGU只是一个带有c#包装器的OpenCV库。我发现OpenCV上的许多资源对EMGU有用,反之亦然

干杯
克里斯

我对EMGU有很多经验。据我所知,您采用的方法是在大图像中显示子图像数据的唯一直接方法。您可能需要刷新较大的图像,这会产生擦除传输数据的固有效果,并将较小的图像复制回来

虽然解决方案是可能的,但我认为这种方法是有缺陷的。所需的处理时间将影响较大可视帧中任何图像的显示速率

一种改进的方法是添加另一个控件。实际上,您的视频馈送窗口在背景中显示较大的图像,而在此窗口上方的较小控件显示较小的图像。实际上,您可以拥有任意数量的这些较小的控件。实际上,您将在两个不同的控件(例如图像框)中显示两个图像或视频源。因为您有代码来执行此操作,所以您所要做的就是确保控件的显示顺序

我假设您没有将输出编程到控制台窗口。如果你还需要帮助,请尽管问

至于评论,EMGU是用C#写的,虽然很感谢您不将EMGU称为OpenCV,但为什么不将其标记为面向OpenCV的问题呢。毕竟,EMGU只是一个带有c#包装器的OpenCV库。我发现OpenCV上的许多资源对EMGU有用,反之亦然

干杯
克里斯

< P>如果使用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); 

注意不要超出大图像的尺寸。

< P>如果你使用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); 

注意不要超出大图像的尺寸。

我不知道这是否有帮助,我没有使用emgu。然而,这就是我如何使用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);
}

我不知道这是否有用,我没有用过emgu。然而,这就是我如何使用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);
}

根据@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);

根据@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);

您使用的是c还是python?你到底是如何完成这个大=小的任务的?既然你说它不起作用,你可能有一些代码,所以如果你也把它贴出来就好了。因为他把它贴上了“emgu”的标签,它可能是emgucv。我希望emgucv的人不要再给它加标签或叫它opencv了……我没有注意到EMGU的一点,所以它不是c和python之间的选择。但问题仍然存在:您使用的是哪种语言?您使用的是c语言还是python语言?你到底是如何完成这个大=小的任务的?既然你说它不起作用,你可能有一些代码,所以如果你也把它贴出来就好了。因为他把它贴上了“emgu”的标签,它可能是emgucv。我希望emgucv的人不要再给它加标签或叫它opencv了……我没有注意到EMGU的一点,所以它不是c和python之间的选择。但问题仍然存在:你使用哪种语言?我想你是想写
cv::Mat subview=big(roi)
?我想你是想写
cv::Mat subview=big(roi)