美文网首页OpenCv
与OpenCV的第七天

与OpenCV的第七天

作者: Code_r_Wang | 来源:发表于2017-01-22 21:28 被阅读55次

第一件事: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;
}

相关文章

网友评论

    本文标题:与OpenCV的第七天

    本文链接:https://www.haomeiwen.com/subject/csbobttx.html