C++ OpenCV像素操作有时不起作用
我尝试使用如下指针修改BGRA mat: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
//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]吗?还可以尝试使用已知值填充图像,并检查结果是否正确。