【问题标题】:OpenCV draw an image over another imageOpenCV 在另一个图像上绘制图像
【发布时间】:2012-06-15 00:46:15
【问题描述】:

是否有一个 OpenCV 函数可以在另一个图像上绘制一个图像? 我有一张Mat 类型的大图。 我有一个Mat 类型的小图像(5x7)。 我想在指定的coordinates 的大图像上绘制这个小图像。

【问题讨论】:

  • 请接受一些答案或说明为什么它们不起作用。尽量不要让这个地方成为开放式问题的墓地。

标签: image opencv


【解决方案1】:

使用Mat::rowRange()Mat::colRange() 在目标Mat 中指定要绘制的区域。代码:

Mat src( 5,  7, CV_8UC1, Scalar(1)); // 5x7
Mat dst(10, 10, CV_8UC1, Scalar(0)); // 10x10

src.copyTo(dst.rowRange(1, 6).colRange(3, 10));

结果如下:

copyTo()之前:

dst:
    ( 0 0 0 0 0 0 0 0 0 0 )
    ( 0 0 0 0 0 0 0 0 0 0 )
    ( 0 0 0 0 0 0 0 0 0 0 )
    ( 0 0 0 0 0 0 0 0 0 0 )
    ( 0 0 0 0 0 0 0 0 0 0 )
    ( 0 0 0 0 0 0 0 0 0 0 )
    ( 0 0 0 0 0 0 0 0 0 0 )
    ( 0 0 0 0 0 0 0 0 0 0 )
    ( 0 0 0 0 0 0 0 0 0 0 )
    ( 0 0 0 0 0 0 0 0 0 0 )

copyTo()之后:

dst:
    ( 0 0 0 0 0 0 0 0 0 0 )
    ( 0 0 0 1 1 1 1 1 1 1 )
    ( 0 0 0 1 1 1 1 1 1 1 )
    ( 0 0 0 1 1 1 1 1 1 1 )
    ( 0 0 0 1 1 1 1 1 1 1 )
    ( 0 0 0 1 1 1 1 1 1 1 )
    ( 0 0 0 0 0 0 0 0 0 0 )
    ( 0 0 0 0 0 0 0 0 0 0 )
    ( 0 0 0 0 0 0 0 0 0 0 )
    ( 0 0 0 0 0 0 0 0 0 0 )

【讨论】:

  • a.copyTo(big.colRange(51,55).rowRange.(63,69)) for 5x7
  • 我已经编辑了完整的东西,所以它变得更清楚了,因为这个答案存在多个问题:索引不正确(@NiksonKantiPaul 发布的索引在范围大小上都太小了 1), rowRange 和 colRange 被交换,还有另一个语法问题。现在应该做得很好。
【解决方案2】:

在大图像中创建一个感兴趣区域,然后将小图像复制到该区域:

cv::Rect roi( cv::Point( originX, originY ), cv::Size( width, height ));
cv::Mat destinationROI = bigImage( roi );
smallImage.copyTo( destinationROI );

如果您确定小图像适合大图像,那么您可以这样做:

cv::Rect roi( cv::Point( originX, originY ), smallImage.size() );
smallImage.copyTo( bigImage( roi ) );

【讨论】:

  • 不幸的是,这似乎对我不起作用,我收到错误:`error: no matching function for call to 'cv::Mat::copyTo(cv::Mat)'。它提供了接收 cv::OutputArray 的候选人,当我查看 opencv.willowgarage.com/documentation/cpp/… 时,它似乎将 Mat 作为参数,但我得到了这个错误?
【解决方案3】:

这里是java版openCV的解决方案

Rect roi= new Rect(originX,originY,smalImage.width(),smallImge.height());
smallImage.copyTo( new Mat(input,roi) );

【讨论】:

    【解决方案4】:
    void zoomImage(Mat &src, Mat &dst, int scale_percent)
    {
    
        //# percent of original size
        int width = int(src.cols * scale_percent / 100);
        int height = int(src.rows * scale_percent / 100);
        Size dim = Size(width, height);
        //pyrUp(tmp, dst, Size(tmp.cols * 2, tmp.rows * 2));
        resize(src, dst, dim, 0.0, 0.0, INTER_CUBIC);
    
        if (scale_percent < 100)
        {
    
            Mat srcR =Mat::zeros(Size(640,480),src.type()) ;
            int rstart = (src.rows - height) / 2;
            int rend = height;
            int cstart = (src.cols - width) / 2;
            int cend = width;
            dst.copyTo(srcR.rowRange( rstart, dst.rows+ rstart).colRange(cstart,dst.cols+ cstart));
            dst = srcR.clone();
    
        }
        else
        {
            Mat  ROI(dst, Rect((width - src.cols) / 2, (height - src.rows) / 2, src.cols, src.rows));
              dst = ROI.clone();
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多