【发布时间】:2012-06-15 00:46:15
【问题描述】:
是否有一个 OpenCV 函数可以在另一个图像上绘制一个图像?
我有一张Mat 类型的大图。
我有一个Mat 类型的小图像(5x7)。
我想在指定的coordinates 的大图像上绘制这个小图像。
【问题讨论】:
-
请接受一些答案或说明为什么它们不起作用。尽量不要让这个地方成为开放式问题的墓地。
是否有一个 OpenCV 函数可以在另一个图像上绘制一个图像?
我有一张Mat 类型的大图。
我有一个Mat 类型的小图像(5x7)。
我想在指定的coordinates 的大图像上绘制这个小图像。
【问题讨论】:
使用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
在大图像中创建一个感兴趣区域,然后将小图像复制到该区域:
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 ) );
【讨论】:
这里是java版openCV的解决方案
Rect roi= new Rect(originX,originY,smalImage.width(),smallImge.height());
smallImage.copyTo( new Mat(input,roi) );
【讨论】:
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();
}
}
【讨论】: