- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试加载图像,因为我必须对其应用算法。如果我加载一个每 channel 8 位的图像,则没有问题,但如果我加载一个 16bpc 的图像,它就会“毁掉”。不幸的是,由于我没有足够的声誉,我无法上传图片。
这些是它们的链接:
要么是源码,要么是8bpc的处理结果
http://postimg.org/image/gc0zf2lp5/
..如果我处理保存为 16bpc 的相同图像的结果
http://postimg.org/image/5nnwee7df/
这是代码:
FreeImage_Initialise();
FREE_IMAGE_FORMAT formato = FreeImage_GetFileType(argv[1], 0);
FIBITMAP* imagetmp = FreeImage_Load(format, argv[1]);
FIBITMAP* image = FreeImage_Rotate(imagetmp, 180);
FreeImage_FlipHorizontal(image);
int depth = FreeImage_GetBPP(image);
printf("depth = %d\n", FreeImage_GetPitch(image));
cv::Mat img(FreeImage_GetHeight(image), FreeImage_GetWidth(image), CV_MAKETYPE(depth/3, 3), FreeImage_GetBits(image), FreeImage_GetPitch(image));
FreeImage_DeInitialise();
它会是什么?
最佳答案
depth
的值不是您所期望的。它指的是 OpenCV 深度定义为:
#define CV_8U 0
#define CV_8S 1
#define CV_16U 2
#define CV_16S 3
#define CV_32S 4
#define CV_32F 5
#define CV_64F 6
因此,如果您知道您的 FreeImage 是 FIT_RGB16
类型,您应该使用值 CV_16U
作为深度。您还应该从 RGB 转换为 BGR,因为 OpenCV Mat
是 BGR 格式。
这里的例子:
#include <FreeImage.h>
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
FreeImage_Initialise();
FREE_IMAGE_FORMAT format = FreeImage_GetFileType("path_to_image", 0);
FIBITMAP* imagetmp = FreeImage_Load(format, "path_to_image");
FIBITMAP* image = FreeImage_Rotate(imagetmp, 180);
FreeImage_FlipHorizontal(image);
int depth = FreeImage_GetBPP(image);
printf("depth = %d\n", FreeImage_GetPitch(image));
// FreeImage to Mat conversion
cv::Mat img(FreeImage_GetHeight(image), FreeImage_GetWidth(image), CV_MAKETYPE(CV_16U, 3), FreeImage_GetBits(image), FreeImage_GetPitch(image));
cvtColor(img, img, CV_BGR2RGB);
FreeImage_DeInitialise();
return 0;
}
请注意,您也可以避免创建额外的 FreeImage 图像只是为了翻转它,并让 OpenCV Mat
来执行此操作:
#include <FreeImage.h>
#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
FreeImage_Initialise();
FREE_IMAGE_FORMAT format = FreeImage_GetFileType("path_to_image", 0);
FIBITMAP* image = FreeImage_Load(format, "path_to_image");
// FreeImage to Mat conversion
cv::Mat img(FreeImage_GetHeight(image), FreeImage_GetWidth(image), CV_MAKETYPE(CV_16U, 3), FreeImage_GetBits(image), FreeImage_GetPitch(image));
cvtColor(img, img, CV_BGR2RGB);
flip(img,img,0);
FreeImage_DeInitialise();
return 0;
}
你不能用cv::imshow
直接显示这个图像。您需要将其转换为 CV_8UC3
类型才能看到。例如,您可以在 imshow
之前调用 convertScaleAbs(img, img);
。
或者可以引用this回答将所有类型的 FreeImage 转换为 OpenCV Mat
s 的函数。
关于c++ - FreeImage+OpenCV - 16 位图像失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31866822/
我在 Mac OS X 10.6 上从 /lib/FreeImage 的源代码编译了 FreeImage 3.10.0。 我可以看到编译后这些文件被复制了: /usr/local/lib/libfre
我正在尝试从使用 Gstreamer 创建的流中提取帧,并尝试使用 FreeImage 或 QImage 保存它们(这个用于测试)。 GstMapInfo bufferInfo; Gs
我正在编写一个小应用程序来读取图像中每个像素的颜色并将其写入文件。首先我是用 Python 做的,但它在大图像上太慢了。然后我发现了 FreeImage 库,我可以使用它,但我不明白如何使用 GetP
我有以下代码来加载纹理。 PackageTexture AssetImporter::ProcessTexture(const boost::filesystem::path& assetPath,
任何人都可以告诉我在哪里可以找到 freeImage.so 吗?我一直在努力寻找相同的东西但没有成功..任何帮助将不胜感激。我已经尝试将 freeimage.a 转换为 freeImage .so 并
我使用的是 Kubuntu 14.04,并安装了 FreeImage 库 sudo apt-get install libfreeimage-dev 据我所知,它已正确安装,/usr/include
我正在尝试遵循 OpenGL 教程,但该教程使用 SOIL(对我不起作用),而我使用的是 FreeImage。 你能告诉我为什么我的代码不起作用吗? 教程代码: // Load texture GLu
如何使用 FreeImage ( http://freeimage.sourceforge.net/ ) 将一些文本添加到图像中? 我搜索了文档,但没有找到有关如何执行此操作的信息 最佳答案 使用 F
我正在为我的 android 项目使用 freeimage.so,我如何访问像素数据,即从 SD 卡拍摄的图片的 RGB 分量,我已经在这个主题上搜索了很长时间..任何帮助都会受到高度赞赏。提前致谢
如标题所述,我正在使用 FreeImage 在我的 OpenGL 游戏中加载纹理,但如何获取子图像? 我现在的代码是这样的: FREE_IMAGE_FORMAT fif = FIF_UNKNO
这是一个简单的问题,但我似乎无法在文档中的任何地方找到答案。我知道 FreeImage 支持 1、4、8、16、24 和 32+ 位 图像。但除此之外,文档还提到 16 位 图像可以是 555 或 5
请帮助我在使用 FreeImage 加载位图后清理我的堆。不知何故删除[]数据;导致 _ASSERTE(_CrtIsValidHeapPointer(pUserData)) 断言,除了评论这一行之外,
我使用 FreeImage 打开一个多页 TIFF 文件并锁定特定页面。之后,我使用以下代码更改页面的图像分辨率: FreeImage.SetResolutionX(page, (uint)outpu
我在网上搜索了如何执行此操作,但找不到任何关于如何禁用 FreeImage 中的某些插件的信息。阅读 Changelog我看到这是可能的,但我找不到任何文档。例如,我不需要 EXR(它需要 OpenE
这适用于使用 FreeImage Library(一个用于管理图像的开源 C 库)的人: http://freeimage.sourceforge.net/ 这个问题已经在不同的论坛多次提交,但我找不
我是 python 新手,建议我使用 Canopy。我正在努力跟进 with this tutorial ,但我陷入了 mahotas.imread 行。我收到一个错误,说以这个结尾: Full er
我已经关注了这方面的帖子,但我仍然没有采取一些步骤。我是 C# 的新手,这可能就是问题所在。我希望得到一点帮助(我整天都在努力解决这个问题)。 我可以在 Visual Studio 中打开 FreeI
我已经从源代码编译并安装了 FreeImage。 当我运行 sudo make install 在我的系统上安装以下文件时 /usr/local/include/FreeImage.h /usr/lo
以下代码 fragment 导致错误....已附加 logcat...我试图将图像路径从 java 代码传递到 NDK 代码,然后我尝试使用 FreeImage 库打开位图.... JNIEXPORT
我正在尝试加载图像,因为我必须对其应用算法。如果我加载一个每 channel 8 位的图像,则没有问题,但如果我加载一个 16bpc 的图像,它就会“毁掉”。不幸的是,由于我没有足够的声誉,我无法上传
我是一名优秀的程序员,十分优秀!