OpenCV像素操作有时不起作用

OpenCV pixel manipulation sometimes is not working

本文关键字:不起作用 操作 像素 OpenCV      更新时间:2023-10-16

我尝试使用这样的指针修改 BGRA 垫子:

//Bound the value between 0 to 255
uchar boundPixelValue(double c) {
    c = int(c);
    if (c > 255)
        c = 255;
    if (c < 0)
        c = 0;
    return (uchar) c;
}
for (int i = 0; i < rows; i++)
        for (int j = 0; j < cols; j++)
            for (int k = 0; k < 3; k++){
                //This loop is accessing the first three channels
                mat.ptr<Vec4b>(i)[j][k] = boundPixelValue(
                        1.0 * mat.ptr<Vec4b>(i)[j][k] * max / avg[k]);
            }

但这每次都会给出不同的输出,有时有效,有时给出白色空白图像。我怀疑这是否是由于非连续数据,有人可以帮忙吗?

一个额外的问题,通常我们在访问行之前先访问 2D 数组的列,因为它通常更快。但是,我必须使用 mat.ptr<Vec4b>(row)[col] .那么,我应该先遍历行然后遍历列吗?

更简单、不那么密集的方法是:

std::vector<cv::Mat> matArray;
cv::split(toBoundMat, matArray);
matArray[0].setTo(0, matArray[0] < 0);
matArray[0].setTo(255, matArray[0] > 255);
matArray[1].setTo(0, matArray[1] < 0);
matArray[1].setTo(255, matArray[1] > 255);
matArray[2].setTo(0, matArray[2] < 0);
matArray[2].setTo(255, matArray[2] > 255);
cv::Mat boundedMat;
cv::merge(matArray, boundedMat);

但我真的不明白你想做什么。双精度数据的值可能介于 1.7E +/- 308 之间。你要么期待一种非常特定的数据,要么你会把它搞砸。如果你想使一个垫子可视化,只需像这样规范化它:

cv::normalize(inMat, destMat, 0, 255, CV_MINMAX);
cv::cvtColor(destMat, destMat, CV_8UC1) //--(8 bit visualizable mat)

这将检查当前垫子的最小值和最大值,并将最小值设置为 0,最大值设置为 255,并将介于两者之间的所有值按比例:)