我正在尝试加载图片,因为我必须对其应用算法。
如果加载每通道8位的图像没有问题,但是如果加载16bpc的图像,则会“损坏”。不幸的是,由于我没有足够的声誉,所以我无法对图像进行翻版。
这些是它们的链接:
源和8bpc处理结果
http://postimg.org/image/gc0zf2lp5/
..result如果我处理保存为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
类型才能看到它。您可以这样做,例如在convertScaleAbs(img, img);
之前调用imshow
。或者,您可以参考this答案以获取将所有FreeImage类型转换为OpenCV
Mat
的功能。