【问题标题】:opencv c++ load image, get very large pixel valuesopencv c++ 加载图像,得到非常大的像素值
【发布时间】:2019-07-26 09:00:16
【问题描述】:

我是 C++ opencv 的新手。我使用以下代码加载图像并打印其像素值:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/videoio.hpp>
cv::Mat cv_img;
cv_img = cv::imread("./input_image/000000.jpg", cv::IMREAD_COLOR);
std::cout << cv_img.rows << "," << cv_img.cols << "," << cv_img.channels() << std::endl;
for (int i = 0; i < 20; ++i)
{
    for (int j = 0; j < 20; ++j)
    {
        std::cout << cv_img.at<cv::Vec3w>(i, j)[0] << ", " << cv_img.at<cv::Vec3w>(i, j)[1] << ", " << cv_img.at<cv::Vec3w>(i, j)[2] << std::endl;
    }
}

for (int i = 0; i < 20; ++i)
{
    for (int j = 0; j < 20; ++j)
    {
        std::cout << cv_img.at<cv::Vec3i>(i, j)[0] << ", " << cv_img.at<cv::Vec3i>(i, j)[1] << ", " << cv_img.at<cv::Vec3i>(i, j)[2] << std::endl;
    }
}

但是当我打印它的像素时,我得到如下值:

5139, 4882, 4628
5139, 4882, 4628
269488655, 336662803, 320147986
320017682, 370349078, 336990996

这绝对是错误的。我尝试使用 opencv-python 加载相同的图像,如下所示:

import cv2
img = cv2.imread("./input_image/000000.jpg", cv2.IMREAD_COLOR)
print(img[0:20,0:20,:])

我得到如下正常输出:

 [[58 59 55]
  [30 31 27]
  [28 29 25]
  ...
  [23 24 20]
  [22 23 19]
  [21 22 18]]

我的 c++ 代码有什么问题?

我尝试替换为cv::Vec3b,但没有成功。印刷品如下:

, <, 8
, ,

(很多空格)

谢谢大家帮助我!

【问题讨论】:

  • 那么是什么让你选择了cv_img.at&lt;cv::Vec3w&gt;cv_img.at&lt;cv::Vec3i&gt;?似乎您只是选择了错误的类型。
  • 你试过cv::Vec3b,对于uchar值应该使用这种类型。

标签: c++ opencv


【解决方案1】:

根据docs。您应该使用cv::vec3b 来访问uchar 数据类型的像素值。

【讨论】:

  • 很抱歉,但这似乎不起作用。我在问题中更新了它。我仍然得到错误的打印。还有其他解决方案吗?谢谢!
  • 也许您需要在打印前将其转换为int。因为数据类型是uchar,所以print语句打印的是ascii码而不是实际值。
猜你喜欢
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2016-04-23
  • 2016-06-10
  • 1970-01-01
  • 2013-02-20
相关资源
最近更新 更多