opencv 矩阵相乘

29 篇文章 1 订阅
8 篇文章 0 订阅

1. dot说明:

  • 1、 对两个向量执行点乘运算,就是对这两个向量对应位一一相乘之后求和的操作,点乘的结果是一个标量。
  • 2、dot方法声明中显示返回值是double,所以A.dot(B)结果是一个double类型数据,不是Mat矩阵,不能把A.dot(B)结 果赋值给Mat矩阵!
    dot操作不对参与运算的矩阵A、B的数据类型做要求,CV_8UC1、CV_32FC1等,可以是任何Opencv定义的类型。
  • 3、 dot操作不对参与运算的矩阵A、B的数据类型做要求,CV_8UC1、CV_32FC1等,可以是任何Opencv定义的类 型,如在2中使用的就是CV_8UC1。
    -4、若参与dot运算的两个Mat矩阵是多通道的,则计算结果是所有通道单独计算各自.dot之后,再累计的和,结果仍是一个double类型数据。

2. Mat矩阵mul——A.mul(B)

Opencv中mul会计算两个Mat矩阵对应位的乘积,所以要求参与运算的矩阵A的行列和B的行列数一致。计算结果是跟A或B行列数一致的一个Mat矩阵。
mul说明:

  • 1、mul操作不对参与运算的两个矩阵A、B有数据类型上的要求,但要求A,B类型一致,不然报错;

  • 2、 Mat AB=A.mul(B),若声明AB时没有定义AB的数据类型,则默认AB的数据类型跟A和B保存一致;

  • 3、 若AB精度不够,可能产生溢出,溢出的值被置为当前精度下的最大值;

1、参与点乘的两个Mat矩阵的数据类型(type)只能是 CV_32F、 CV_64FC1、 CV_32FC2、 CV_64FC2 这4种类型中的一种。若选用其他类型,比如CV_8UC1,编译器会报错。

3. opencv将整数像素图片转化为浮点型

将CV_8UC3转化为CV_32FC3的图片:src.convertTo(dst, CV_32FC3, 1 / 255.0);//其中dst为目标图, CV_32FC3为要转化的类型

第三个参数 1 / 255.0意义:

在整数表示的颜色空间中,数值范围是0-255,但在浮点数表示的颜色空间中,数值范围是0-1.0,所以要把0-255归一化。
CV_8UC3的灰度或BGR图像的颜色分量都在0~255之间。直接imshow可以显示图像。 CV_32FC3取值范围为0~1.0,imshow的时候会把图像x255后再显示。imwrite不能保存浮点数类型的图片。

void cvCvtColor( const CvArr* src, CvArr* dst, int code );

当code选用CV_BGR2HSV时,对于8位图,需要将RGB值归一化到0-1之间。这样得到HSV图中的H范围才是0-360,S和V的范围是0-1。

注意在把BGR图转化为HSV时,code可以是CV_BGR2HSV,也可以是CV_RGB2HSV,在由HSV转化回RGB时要注意保持一致CV_HSV2BGR,CV_HSV2RGB

基于opencv的mask换背景操作:

#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
	int n = argc;
	string img1_path = argv[1];
	string img2_path = argv[2];
	string img3_path = argv[3];

	Mat img_fgd = cv::imread(img1_path, cv::IMREAD_COLOR);
	Mat img_bgd = cv::imread(img2_path, cv::IMREAD_COLOR);
	Mat img_newbg = cv::imread(img3_path, cv::IMREAD_COLOR);

	Mat img_fgd_f, img_bgd_f, img_newbg_f, merge_f;
	img_fgd.convertTo(img_fgd_f, CV_32FC3, 1 / 255.0);
	img_bgd.convertTo(img_bgd_f, CV_32FC3, 1 / 255.0);
	img_newbg.convertTo(img_newbg_f, CV_32FC3, 1 / 255.0);
	Mat img_one(img_fgd.rows, img_fgd.cols, CV_32FC3, Scalar(1.0, 1.0, 1.0));
	merge_f = img_fgd_f.mul(img_bgd_f) + img_newbg_f.mul(img_one - img_bgd_f);
	Mat img_seg;
	merge_f.convertTo(img_seg, CV_8UC3, 255);
	imwrite("img_seg.jpg", img_seg);
	return 0;
}

这段程序分别输入 srcimg, mask,newbackgroundimage 就可以实现图像换背景操作。如下所示。

在这里插入图片描述
在这里插入图片描述

参考:opencv将整数像素图片转化为浮点型

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落花逐流水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值