OpenCV像素操作有时不起作用
OpenCV pixel manipulation sometimes is not working
我尝试使用这样的指针修改 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,并将介于两者之间的所有值按比例:)
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- 为什么当我对数组使用增量操作时,do for 循环不起作用
- OpenCV像素操作有时不起作用
- 操作溢出不起作用C
- 由于某种原因,使用 OR 运算符执行操作不起作用
- Boost.Spirit解析字符串的语义操作不起作用
- GDB 跟踪点的操作不起作用
- 当 std::fprintf(stderr,..) 失败时,操作是否不起作用,或者可以在失败之前写入一点
- 提升异步操作不起作用(对我来说)
- 矢量上的擦除操作不起作用
- 迭代器操作不起作用
- 带有制表符的strcat操作不起作用
- 标准函数和操作在类构造函数中不起作用