C++ OpenCV像素操作有时不起作用

C++ OpenCV像素操作有时不起作用,c++,opencv,opencv3.0,C++,Opencv,Opencv3.0,我尝试使用如下指针修改BGRA mat: //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 (in

我尝试使用如下指针修改BGRA mat:

//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]);
            }
cv::normalize(inMat, destMat, 0, 255, CV_MINMAX);

cv::cvtColor(destMat, destMat, CV_8UC1) //--(8 bit visualizable mat)
//将值绑定在0到255之间
uchar边界像素值(双c){
c=int(c);
如果(c>255)
c=255;
if(c<0)
c=0;
返回(uchar)c;
}
对于(int i=0;i
但这每次都会产生不同的输出,有时工作,有时产生白色空白图像。我怀疑这是否是由于不连续的数据造成的,有人能帮忙吗


还有一个问题,通常我们在访问行之前先访问2D数组的列,因为这样通常更快。但是,我必须使用
mat.ptr(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);

这将检查当前Mat的最小值和最大值,并将最小值设置为0,最大值设置为255,所有中间值按比例设置:)

什么是
boundPixelValue
max
avg
?什么类型?我在问题中添加了boundPixelValue。“max”是整数类型,“avg”是整数数组。请检查我答案中的代码。如果它对您有效,我会更好地解释它的作用(我没有足够的细节来保证它现在有效,请查看如何执行)。嗯,看起来它可以被重写为
拆分
频道上的一个简单矩阵表达式(然后您将
合并
boundPixelValue
看起来像是OpenCV可以实现的常规饱和。您尝试过mat.at(i,j)[k]吗?还可以尝试使用已知值填充图像,并检查结果是否正确。