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 就可以实现图像换背景操作。如下所示。