gpt4 book ai didi

opencv - 向Mat对象添加标量

转载 作者:行者123 更新时间:2023-12-02 16:14:07 26 4
gpt4 key购买 nike

因此,我试图将标量值添加到openCV中Mat对象的所有元素,但是对于raw_t_ubit8和raw_t_ubit16类型,我得到了错误的结果。这是代码。

Mat A;
//Initialize Mat A;
A = A + 0.1;

矩阵最初是
enter image description here

加法的结果是完全相同的矩阵。当我尝试将标量添加到raw_t_real类型的矩阵时,不会发生此问题。通过raw_t_ubit8,我的意思是深度为CV_8UC1

最佳答案

如评论和@Antonio的回答中所述,您不能将0.1加到整数中。

如果使用的是CV_8UC1矩阵,但要使用浮点值,则应乘以255。

Mat1b A; // <-- type CV_8UC1
...
A += 0.1 * 255;

如果需要转换操作的结果(在这种情况下),则最终会调用 saturated_cast

这等效于@Antonio的答案,但是它可以使代码更简洁(至少对我而言)。
如果对 doubleScalar求和,将使用相同的代码。将使用以下两种方式创建 Scalar对象:
template<typename _Tp> inline
Scalar_<_Tp>::Scalar_(_Tp v0)
{
this->val[0] = v0;
this->val[1] = this->val[2] = this->val[3] = 0;
}

但是,如果您需要对矩阵精确地求和0.1(而不是按255进行缩放),则需要将矩阵转换为CV_32FC1:
#include <opencv2/opencv.hpp>
using namespace cv;

int main(int, char** argv)
{
Mat1b A = (Mat1b(3,3) << 1,2,3,4,5,6,7,8,9);

Mat1f F;
A.convertTo(F, CV_32FC1);
F += 0.1;

return 0;
}

关于opencv - 向Mat对象添加标量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31805029/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com