与OpenCV的第七天

第一件事:ROI 区域图像叠加&图像混合

1. ROI:感兴趣区域

定义一个 ROI 有两种方法:

  • 第一种使用 Rect 来表示感兴趣的区域:
    它指定矩形的左上角坐标和矩形的长度,来定义一个矩形区域。
    示例代码:
#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
    cv::Mat image = cv::imread("1.jpg");
    cv::Mat logo = cv::imread("logo.jpg");
    cv::Mat imageROI;
    cv::Mat imageROI = image(cv::Rect(500,250,logo.cols,logo.rows));
    cv::imshow("roi",imageROI);
    cv::waitKey();
    return 0;
}
  • 第二种方法,是指定感兴趣的行或列的范围。Range 表示从起始位子到终止位置的索引。
    示例代码:
cv::Mat image = cv::imread("1.jpg");
cv::Mat logo = cv::imread("logo.jpg");
cv::Mat imageROI;
cv::Mat imageROI = image(cv::Range(250,250 + logo.rows), cv::Range(200, 200 + logo.cols));

2. 线性混合操作

典型二元像素操作,理论公式如下:

线性混合理论公式

我们通过改变 α 的值来实现两张图片的叠化效果。OpenCV 为我们封装好了一个 addWeight 函数来实现这个功能。我们继续往下看。

3. 计算数组加权和:addWeight 函数

这个函数的作用是计算两个矩阵的加权和。函数原型:

void addWeighted(InputArray src1, double alpha, InputArray src2,
                              double beta, double gamma, OutputArray dst, int dtype = -1);
参数 解释
InputArray src1 表示要加权的第一个矩阵
double alpha 表示第一个数组的权重值
InputArray src2 表示要加权的第二个矩阵,需要和第一个数组具有相同的通道数和尺寸
double beta 表示第二个数组的权重值
double gamma 加到权重总和上的一个常量
OutputArray dst 输出矩阵
int dtype 输出矩阵的可选深度,默认-1,代表 src1 的图像深度

示例代码:

#include <opencv2/opencv.hpp>
int main(int argc, const char * argv[]) {
    cv::Mat srcImage = cv::imread("1.jpg");
    cv::Mat logoImage = cv::imread("Code_r_Wang.jpg");
    cv::Mat imageROI;
    cv::Mat dstImage;
    cv::imshow("srcwindow", srcImage);
    cv::addWeighted(srcImage(cv::Rect(0,0,logoImage.cols,logoImage.rows)), 0.5, logoImage, 0.5, 0.0, srcImage(cv::Rect(0,0,logoImage.cols,logoImage.rows)));
    
    cv::imshow("window", srcImage);
    cv::waitKey();
    return 0;
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容