gpt4 book ai didi

c++ - 通过 at 和通过数据 OpenCV 访问像素的区别

转载 作者:行者123 更新时间:2023-11-28 01:59:28 26 4
gpt4 key购买 nike

今天我观察到一件有趣的事情:如果我使用函数“at”访问图像像素,我收到的结果与如果我使用图像成员“数据”访问图像像素时收到的结果不同。
有人知道为什么会这样吗?

int main()
{
double sigma = 1.0;
cv::Mat verticalGaussianKernel = getGaussianKernel(7, sigma);
printImg(verticalGaussianKernel);
return 0;
}
void printImg(cv::Mat &img)
{
cout << "---------//------\n";
if (img.empty())
{
cout << "Empty Image\n";
return;
}

for (int i = 0; i < img.size().height; i++)
{
for (int j = 0; j < img.size().width; j++)
{
cout << int(img.data[i * img.size().height + j]) << " " << img.at<double>(i, j) << endl;
}
cout << endl;
}
cout << "---------//------\n";
}

它的代码给出了结果:

data-------at
48------0.00443305
63------0.0540056
171-----0.242036
251-----0.39905
10------0.242036
12------0.0540056
84------0.00443305

起初我认为数据中的值归一化为 0-255,但最后一个字符串反驳了我的猜测

最佳答案

你的类型转换是错误的。 .data 成员是一个 uchar*,您正在取消引用它并将该值(单个 uchar)转换为 int 这就是您没有获得正确值的原因。

正确的方法是将其转换为 double * 然后取消引用它。下面的代码就是这样做的。

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

void printImg(cv::Mat &img) {
cout << "---------//------\n";
if (img.empty()) {
cout << "Empty Image\n";
return;
}

for (int i = 0; i < img.rows; i++) {
for (int j = 0; j < img.cols; j++) {
cout << reinterpret_cast<double *>(img.data)[i * img.cols + j]
<< " " << img.at<double>(i, j) << endl;
}
cout << endl;
}
cout << "---------//------\n";
}

int main() {
double sigma = 1.0;
cv::Mat verticalGaussianKernel = getGaussianKernel(7, sigma);
cout << verticalGaussianKernel << endl;
printImg(verticalGaussianKernel);
return 0;
}

输出:

[0.004433048175243745;
0.05400558262241448;
0.2420362293761143;
0.3990502796524549;
0.2420362293761143;
0.05400558262241448;
0.004433048175243745]
---------//------
0.00443305 0.00443305

0.0540056 0.0540056

0.242036 0.242036

0.39905 0.39905

0.242036 0.242036

0.0540056 0.0540056

0.00443305 0.00443305

关于c++ - 通过 at 和通过数据 OpenCV 访问像素的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40067976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com