c++ - C++ 中的 OpenCV 整数除法不符合预期

标签 c++ opencv

给定以下输出:

[11233, 11345, 11434, 10897] [44, 44, 45, 43] [-31, 81, -86, -111]

来自这段代码

std::cout << mat32sc1;
channels[1] = mat32sc1 / 256;
channels[0] = mat32sc1 - channels[1] * 256;
std::cout << channels[1];
std::cout << channels[0];

我本以为 11233/256 是 43,使用整数除法?

我的假设是否错误,即 C++ 总是按底数进行整数除法?

更新

这是我当前的编码函数。

void encode(cv::Mat & src, cv::Mat & dst)
{
    cv::Mat_<int> mat32sc1;
    src.convertTo(mat32sc1, CV_32SC1, 10, 11000);

    std::vector<cv::Mat> channels;
    channels.resize(3);

//  bitwise_and(mat32sc1, cv::Scalar(255), channels[0]); // is this needed or will converTo truncate automaticly.
//  channels[0].convertTo(channels[0], CV_8UC1);
//  mat32sc1.convertTo(channels[1], CV_8UC1, 1.0 / (1 << 8));
    channels[2] = cv::Mat::zeros(src.rows, src.cols, CV_8UC1);
    int flag = 256;
//  std::cout << mat32sc1;
    channels[1] = mat32sc1 / flag;
    channels[0] = mat32sc1 - channels[1] * flag;
    cv::Mat_<int> off = (channels[0] < 0) / 255;
    //std::cout << off;
    channels[1] -= off;
    channels[0] = mat32sc1 - channels[1] * flag;


    //std::cout << channels[1];
    //std::cout << channels[0];
    channels[0].convertTo(channels[0], CV_8UC1);
    channels[1].convertTo(channels[1], CV_8UC1);

    cv::merge(channels, dst);
}

获得相同结果的任何更聪明的方法

最佳答案

除法确实不是整数除法。 OpenCV 中的大多数函数将其输入转换为标量,这是 1、2、3 或 4 个 double 的容器。 OpenCV 中执行类似操作的其他函数(scaleAdd、addWeighted、convertTo 等)也都适用于 double 。换句话说,您的代码执行双除和结果舍入。这就是为什么你得到 44 而不是 43。

编辑:

至于“编码”功能,您不需要执行复杂的操作。新矩阵的字节已经存在。您只需要创建方便的方式来访问它们:

Mat temp(src.size(), CV_8UC4, src.data);

这将创建指向 src 数据的新矩阵头(即没有数据拷贝)。但不是将数据视为单 channel 整数矩阵,而是 unsigned char 的 4 channel 矩阵(具有相同的宽度和高度)。你可以用多 channel 矩阵做任何事情:split()、merge()、mixChannels() 等...

关于c++ - C++ 中的 OpenCV 整数除法不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25968047/

相关文章:

c++ - OpenCV "Undefined reference to ' cv::imread' 等 C++

c++ - 条件模板变量

c++ - 简单代码的意外结果

c++ - std::multimap 如何存储它的元素?

java - OpenCV Java 微笑检测

c++ - 如何将 void 指针转换为 int[3]?

python - 使用 OpenCV 测量物体的表观长度(以像素为单位)

algorithm - 删除图像中的多余线条

c++ - 在 OpenCV 中使用 PCA 进行降维

opencv - 在 openCV 中删除图像的特定部分