当前位置:   article > 正文

opencv 矩阵相乘_opencv矩阵相乘

opencv矩阵相乘

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 );
  • 1

当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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/285056
推荐阅读
相关标签
  

闽ICP备14008679号