目录
感兴趣区域(ROI)
在图像中选择一个区域。
定义ROI区域的方法有两种形式:
方法一:
使用Rect,指定左上角坐标以及矩形的长宽
Mat roi = image(Rect(100, 100, 250, 250));
image是已经载入的图像。
方法二:
指定感兴趣区域的行和列的范围
Mat roi = image(Range(20, 150), Range(30, 300));
Range:指从其实索引到终止索引的连续序列
显示效果:
代码:
#include <iostream> #include "opencv2/opencv.hpp" using namespace cv; int main() { cv::Mat image = imread("E:\\roi_test.png"); cv::imshow("源图", image); cv::Mat roi = image(Range(30, 280), Range(60, 300)); cv::imshow("roi", roi); cv::waitKey(0); return 0; }
图像混合
先指定ROI,在用addweighted对指定的ROI区域的图像进行混合的操作。
线性混合操作是一种典型的二元的像素操作,理论公式为:
g(x) = (1 - a)F1(x) + aF2(x)
a代表alpha的值(0.0~1.0),对两幅图像(F1(x)和F2(x))或两段视频(F1(x)和F2(x))产生时间上的画面叠化效果,前面页面切换至后面页面的一种叠加效果。
实现方式:addWeighted函数:计算两个数组(图像阵列)的加权和
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1);
参数1,InputArray类型的src1,表示需要加权的第一个数组;
参数2,double类型的alpha,表示src1的权重;
参数3,InputArray类型的src2,表示第二个数组,它需要和src1拥有相同的尺寸和通道数;
参数4,double类型的beta,表示src2的权重值;
参数5,double类型的gamma,一个加到权重总和上的标量值。
参数6,OutputArray类型的 dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道 数;
参数7,int类型的dtype,输出阵列的可选深度,有默认值-1。当两个输入数组具有相同的深 度时,这个参数设置为-1(默认值),即等同于src1.depth()。
两个数组 (src1和src2 ) 的加权和: 对 addWeighted 参数中 beta 位为 1 - alpha
gamma 位为0
dst = src1[ i ] * alpha + src2[ i ] * beta + gamma;
i:多维数组元素的索引值,再多通道数组的情况下,每一个通道需要独立处理。当输入数组的深度为CV_32S时,此函数不适用。
显示效果:
代码:
Mat srcImg1; Mat srcImg2; Mat srcImg3; srcImg1 = imread("E:\\img\\logo3.png"); srcImg2 = imread("E:\\img\\logo4.png"); imshow("源图srcImg1", srcImg1); imshow("源图srcImg2", srcImg2); addWeighted(srcImg1, 0.5, srcImg2, 0.5, 0.0, srcImg3); imshow("混合的srcImg3", srcImg3);
也可以指定roi之后,再将图片中的某个区域进行混合。