当前位置: 首页 > article >正文

opencv Mat数据 乘以系数

需要 Mat 数据乘以一个系数  

  cout << "Bgain: " << Bgain << endl;cout << "Ggain: " << Ggain << endl;cout << "Rgain: " << Rgain << endl;



一、 常数变同型矩阵,采用 Mat::multiply 函数 进行矩阵运算。

需要注意的2个问题:

1、如果常数是浮点型,那么定义同型矩阵时候,要定义成CV_32FC1的格式,否则会变成 取整处理后的同型矩阵;

2、采用Mat::multiply函数进行运算时,会发生报错现象,目前未解决。


  Mat BgainMat(B.rows, B.cols, CV_8UC1, Scalar::all(Bgain));Mat GgainMat(G.rows, G.cols, CV_8UC1, Scalar::all(Ggain));Mat RgainMat(R.rows, R.cols, CV_8UC1, Scalar::all(Rgain));Rect re(4180, 1650, 6, 6);cout << "BgainMat: " << BgainMat(re) << endl;cout << "GgainMat: " << GgainMat(re) << endl;cout << "RgainMat: " << RgainMat(re) << endl;




修改Scalar 数值:

  Mat BgainMat(B.rows, B.cols, CV_8UC1, Scalar::all(3.56));Mat GgainMat(G.rows, G.cols, CV_8UC1, Scalar::all(1.25));Mat RgainMat(R.rows, R.cols, CV_8UC1, Scalar(Rgain));Rect re(4180, 1650, 6, 6);cout << "BgainMat: " << BgainMat(re) << endl;cout << "GgainMat: " << GgainMat(re) << endl;cout << "RgainMat: " << RgainMat(re) << endl;



原因: 无论Scalar是什么浮点值,输出的均为四舍五入后的整数型

问题不在输入参数,在于Mat类型的定义  8UC1  


Mat.hpp  源码 :

    int type() const;/** @brief Returns the depth of a matrix element.The method returns the identifier of the matrix element depth (the type of each individual channel).For example, for a 16-bit signed element array, the method returns CV_16S . A complete list ofmatrix types contains the following values:-   CV_8U - 8-bit unsigned integers ( 0..255 )-   CV_8S - 8-bit signed integers ( -128..127 )-   CV_16U - 16-bit unsigned integers ( 0..65535 )-   CV_16S - 16-bit signed integers ( -32768..32767 )-   CV_32S - 32-bit signed integers ( -2147483648..2147483647 )-   CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN )-   CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )*/



矩阵输出问题解决,

但是矩阵运算出现报错

  multiply(B, BgainMat, newB);multiply(G, GgainMat, newG);multiply(R, RgainMat, newR);


二、 通过 cvConvertScale 函数进行运算。

但是 : 存在一些小问题

  cvConvertScale(B, newB, Ggain,0);

不存在 从 Cv::Mat 到 Cv::Arr *  的适当转换函数

参考博文 : 上篇转载  该博文的解决方案是,针对Mat类型的数据,选用不以cv开头的函数。

cvConvertScale :以cv开头的函数 输入参数列表  矩阵类型 大都为  cv::Arr * 类型      以Mat类型作为输入参数时会报错的  不存在 Mat 到 Arr的适当转换函数

convertMaps :  不带cv的函数  输入参数多为  cv::inputArray  类型  ,    此类函数 输入参数类型  Mat 类型的是可以的。


三、自己写代码,对Mat数据元素进行操作的方式实现:

需要注意存在的问题:当计算结果超出255时,注意处理溢出问题。否则图像结果会发生如下的问题。

  for (int i = 0; i < B.rows;i++){//uchar* dataB = B.ptr<uchar>(i);//uchar* dataNewB = newB.ptr<uchar>(i);for (int j = 0; j < B.cols;j++){//dataNewB[j] = dataB[j] * Bgain;  // 指针访问的方式 操作数据元素//dataNewG[j] = dataG[j] * Ggain;//dataNewR[j] = dataR[j] * Rgain;newB.at<uchar>(i, j) = B.at<uchar>(i, j) * Bgain; // 动态地址访问方式 操作数据元素newG.at<uchar>(i, j) = G.at<uchar>(i, j) * Ggain;newR.at<uchar>(i, j) = R.at<uchar>(i, j) * Rgain;}}

输出结果显示, newB发生了 数据的溢出。

处理后的图片效果:




四、简洁可行

最后,最后, 发现,Mat矩阵 直接乘以数值就可以了,并且能自动满足溢出时取最大值255的处理。  兜兜转转一大圈,最初曾经这样试过,可能某个地方出问题了,结果绕了一圈,想了很多其它的如前述的方式进行计算,足足花费一天时间。

  newB = B * Bgain;newG = G * Ggain;newR = R * Rgain;cout << "newB: " << newB(re) << endl;cout << "newG: " << newG(re) << endl;cout << "newR: " << newR(re) << endl;cout << "newC: " << newC(re) << endl;























http://www.lryc.cn/news/2418370.html

相关文章:

  • 爱色影音播放器免费版
  • php卡盟主站_《卡盟源码秒卡购》运营级别卡盟系统源码支持API站对接站[带有SUP+商户+支持秒搭建主站]...
  • CC软件的一些实用技巧
  • 小明医声发布,看AI技术秀得飞起
  • colab使用步骤
  • 【微信小程序】从零开始搭建微信小程序项目
  • 云联惠认证时间_2019年4月份了,云联惠目前是什么情况?大家报案了吗?
  • 中国雅虎首页改版彻底与口碑网剥离
  • 虚幻引擎[真实字幕组]开始公开招募!这太真实了!
  • 苏州Uber优步司机奖励政策(4月2日~4月3日)
  • 【美团20240309笔试算法题】小美的数组询问
  • ZooKeeper实战总结
  • WAVE SUMMIT+ 2023 倒计时:走进青少年开发者的AI创新之旅
  • 程序猿购物指南
  • ruby 生成html,Ruby编写HTML脚本替换小程序的实例分享
  • XPE一般性组件整理
  • 分布式系统中CAP理论详解、面试必问、看完你就理解了
  • 日语的颜色与色彩
  • 摩托罗拉XOOM解锁,刷入Recovery,XOOMROOT,卡刷ROM最全最实用的教程
  • How to play a video file?
  • AV管理 智联无限 | ATLONA全国巡回路演成功亮相济南!
  • IT男,你应该在任何行业所向披靡
  • Facebook:每天数千次配置更新,如何实现用户零干扰
  • 会议技术发展与高清视频会议系统
  • Metro风格的Java组合框(JMetro)–重新介绍
  • [2011-04-30]返现网排行榜
  • 108 道 Python 面试笔试题超强汇总 - 下部
  • Affinity Designer Beta for Mac(专业平面设计软件)
  • OMNIPAY(欧米派、欧米链)-全球领先的多链数字钱包
  • 免费资源网站大全