【问题标题】:C++ loading and looping through pixels of an image (JPEG format)C++ 加载和循环图像像素(JPEG 格式)
【发布时间】:2016-03-13 05:41:36
【问题描述】:

您好,至少感谢您帮助我。

我需要首先加载一个图像,然后遍历该图像的所有像素并检查每个像素的颜色。

我从来没有尝试过摆弄图片之类的东西。

非常感谢任何帮助。

谢谢。

【问题讨论】:

  • 一旦您可以访问这些像素,您希望如何处理它们?您使用的是什么操作系统?
  • 之后我不需要对像素做任何事情。我只需要他们颜色的文档,就是这样。在循环之后,他们可以为我所关心的一切下地狱。我正在使用 Windows。仅供参考,如果这很重要,我正在使用 CodeBlocks。 @MarkSetchell
  • 你是什么意思“他们颜色的文档”?如果您的图像很小,例如 200 像素 x 100 像素,您将有一个 20,000 像素的列表,每个像素都有自己的颜色 - 您想要什么?
  • 嗯,这个项目的目的是知道一个骰子显示了多少个点。我有办法做到这一点。可能效率低下,但我确实有一个计划,我非常想尝试一下。 (除非你有建议)。所以我想检查几个像素的颜色。差不多。。一群人。就像,将这个与上一个和下一个进行比较,看看它们是否是相同的颜色。然后将这些与下面和上面的比较,看看它是否是一个组,一个点。基本上,在循环期间是我所做的所有处理,之后我什么都不需要。 @MarkSetchell

标签: c++ image loops colors pixel


【解决方案1】:

从更大的角度来看,在计算骰子上的点时,我会考虑使用 ImageMagick - 使用来自 here 的名为 Magick++ 的 C++ 绑定

我会考虑使用 “Blob 分析”“连接组件分析” 来计算骰子上的点。

使用这个骰子...

如果我像这样在命令行中使用 ImageMagick:

convert dice.png     -colorspace gray -threshold 50% \
   -define connected-components:verbose=true         \
   -define connected-components:area-threshold=10    \
   -connected-components 8 -auto-level output.png

输出

Objects (id: bounding-box centroid area mean-color):
  0: 380x362+0+0 189.6,180.0 103867 srgba(255,255,255,1)
  2: 93x92+248+32 293.8,77.5 6743 srgba(0,0,0,1)
  4: 92x93+39+241 84.8,286.7 6741 srgba(0,0,0,1)
  5: 93x93+248+241 293.8,286.8 6738 srgba(0,0,0,1)
  1: 92x92+39+32 84.8,77.5 6736 srgba(0,0,0,1)
  3: 93x93+143+136 189.3,182.1 6735 srgba(0,0,0,1)

你可以看到它找到了 5 个点(第一个实际上是整个白色图像),我可以像这样在每个点周围放一个红色框,这样你就可以看到它找到了什么:

convert dice.png -stroke red -fill none -strokewidth 1 -draw "rectangle 248,32 341,124" -draw "rectangle 39,241 131,334" -draw "rectangle 248,241 341,334" -draw "rectangle 39,32 131,124" -draw "rectangle 143,136 236,229" result.png

【讨论】:

  • ImageMagick 并不是很有帮助(我认为),因为我必须自己完成所有工作。这是一个学校项目。这就是为什么我需要的只是一种加载图像并循环遍历像素的方法。 (并访问每个像素的颜色)@Mark Setchell
【解决方案2】:

我想你可能会使用 OpenCV 图像处理库。您有一个详细的 VS2013 安装手册: OpenCV installation for Visual Studio 2013

安装后。您将获得很多图像处理功能,包括您正在寻找的功能。

例如:

Mat inputImage = imread(filename, CV_LOAD_IMAGE_COLOR);

然后: Cycle through pixels with opencv

【讨论】:

  • 是什么让您认为 OP 正在使用 Visual Studio?甚至是 Windows?
  • 我不能在这个项目中使用 Visual Studio。如果可以的话,我会的。 OpenCV中有很多此类问题的示例。我希望我可以使用它。不过还是谢谢! @Assaf Rabinowitz
  • 1. OpenCV 是跨平台的。您可以在任何操作系统上使用它。 2. 我知道你也可以为 Eclipse 安装 OpenCV,也许可以安装更多的 IDE。你到底在做什么? @马克
  • 也许这对你有用:OpenCV with CodeBlocks
【解决方案3】:

您可以使用的一种方法是将文件解释为二进制文件。如果您知道如何解释标题部分并知道图像的颜色深度(标题有这样的信息),那么只比较二进制或十六进制颜色代码就不会太远了——可能是十六进制,因为 C++ 没有内置的二进制变量。

如果您认为自己无法处理二进制文件并需要使用库,请参阅 How do I read JPEG and PNG pixels in C++ on Linux?

编辑 - 或仅使用任何图像处理库,例如 http://cimg.eu,因为目标似乎是从图像中解释骰子。

【讨论】:

  • 我尝试过使用 cimg,但似乎无法正确安装。我忘了提到我对所有这些东西都是新手吗?无论如何,如果你能找到安装它的指南(我找不到)或者你能解释如何安装它,我会很棒。此外,我想要的只是加载图像并循环遍历所有像素。没有其他的。谢谢。
  • 由于 Cimg 是一个仅包含标头的模板库,因此您需要执行以下操作 - 将下载的 zip 中的文件放入与您的项目相同的目录中,并像 #include "Cimg 一样包含头文件.h" 之后只需查看示例目录以获取有关如何使用它的说明。
  • 我不是新人。我以为还有更多。我确实这样做了,但遇到了很多不同的错误。这就是为什么我认为我做错了什么
  • 错误是说我缺少几个头文件。 cstdio.h、cstdlib.h 等。
  • 这些是包含在 C/C++ 编译器包中的标准库。您应该 #include 类似于“#include ”的上述头文件,因为 Cimg 使用标准库函数,所以它会抛出这些类型的错误 - 这些通常不会添加到其他库文件中,以避免重复包含会产生链接器错误。
猜你喜欢
  • 2014-06-18
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
相关资源
最近更新 更多