#include
using namespace cv;
int main()
{
Mat src = imread("E:\\Test.jpg");
Mat src_ROI;
src_ROI = src(Rect(100, 0, 300, 300)).clone();
imshow("SRC",src);
imshow("ROI", src_ROI);
waitKey(0);
return 0;
}
src(Rect(100, 0, 300, 300))
即可实现,原理是什么呢?通过读API发现,Mat类定义中,对括号运算符进行了重载Mat cv::Mat::operator() (const Rect & roi) const;
通过 cv::Rect()
函数指定ROI区域范围,返回Mat型ROI,注意,这里的ROI是引用值,如果原图像被修改,ROI会随之而变。
除此之外,还可以通过Range类来指定ROI区域,用法与上类似。
Mat cv::Mat::operator()(Range rowRange,
Range colRange
)const
Range类是OpenCV中的抽象数据类,表示连续数据的起始位置,可以理解为,Range=[star,end];
#include
using namespace cv;
int main()
{
Mat src1 = imread("E:\\1.jpg");
Mat src2 = imread("E:\\2.jpg");
Mat dst;
imshow("src1", src1);
imshow("src2", src2);
addWeighted(src1, 0.5, src2, 0.5,0.0,dst);
imshow("dst", dst);
waitKey(0);
imwrite("E:\\3.jpg", dst);
return 0;
}
cv::addWeighted()
函数来实现,其定义为:void cv::addWeighted(
InputArray src1,
double alpha,
InputArray src2,
double beta,
double gamma,
OutputArray dst,
int dtype = -1
)
其中,InputArray和OutputArray是OpenCV提供的强大的接口类,兼容Mat类型,因此,在这里,可以当做Mat类型进行处理。
alpha和beta分别是输入图像对应的权重,均为double型,而gamma是混合图像相加的标量,该过程计算如下:
dst(I)=saturate(src1(I)∗alpha+src2(I)∗beta+gamma)
I表示图像,gamma是通过+的运算符重载,加到每一个像素点上。
注意,输入的图像必须具有相同的图像尺寸(rows和cols)和深度(depth和channels), 不然会出现运行时异常。