赞
踩
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,编译器会报错。
将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 就可以实现图像换背景操作。如下所示。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。