gpt4 book ai didi

c++ - 如何将 JPG 图像读取为 CV_16UC1 并在屏幕上打印?

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

我想读一本JPG图片为 CV_16UC1OpenCV (在 C++ 中)。

我也可以从 CV_8UC3 转换至 CV_16UC1 .

下面的代码有效,但这里它只使用了 CV_8UC3格式,这不是我需要的:

using namespace cv;
int main()
{
Mat im1 = imread("MyPic.JPG");
Mat im2 = imread("MyPic.JPG");
Size sz1 = im1.size();
Size sz2 = im2.size();

Mat final(sz1.height, sz1.width + sz2.width, CV_8UC3);
Mat left(final, Rect(0, 0, sz1.width, sz1.height));
im1.copyTo(left);

Mat right(final, Rect(sz1.width, 0, sz2.width, sz2.height));
im2.copyTo(right);

imshow("final", final);
waitKey(0);
return 0;
}

但我需要使用 CV_16UC1 (这真的必要!)。因此,我已经这样转换了:

    cv::Mat im2 = cv::imread("MyPic.jpg");
cv::Size sz2 = im2.size();

cv::Mat im3; // I want im3 to be the CV_16UC1 of im2
im2.convertTo(im3, CV_16UC1);
cv::Size sz3 = im3.size();

cv::Mat im1 = cv::imread("MyPic.jpg");
cv::Size sz1 = im1.size();

cv::Mat im4;
im4.convertTo(im1, CV_16UC1);
cv::Size sz4 = im4.size();

// Two images by each other side - this must be CV_16UC1
cv::Mat final(sz1.height, sz1.width + sz2.width, CV_16UC1);

// The left image
cv::Mat left(final, cv::Rect(0, 0, sz1.width, sz1.height));
im1.copyTo(left);

// The right image
cv::Mat right(final, cv::Rect(sz1.width, 0, sz2.width, sz2.height));
im4.copyTo(right);

cv::imshow("final", final);

cv::waitKey(0);

似乎我在转换或阅读方式上做错了,因为屏幕上没有显示图像。

如何从 CV_8UC3 正确转换至 CV_16UC1

最佳答案

8 位无符号 Mat 的像素值范围在 0 到 255 之间,因此,当您从文件加载图像并显示它们时,每个像素越接近最大值 255 就会越亮。

当您将这些图像转换为 16 位无符号时,像素将保持相同的绝对值(介于 0 和 255 之间),但现在您的数据结构的最大值为 65535。因此,毫不奇怪图像很暗。即使是更高的值 (255) 在新分辨率下仍然会很低,看起来就像不存在一样。

"How to read JPG images as CV_16UC1 and print on screen?"

你不能。 .jpg 图像不是 CV_16UC1。如果您生成这些图像并认为它们会保存 16 位数据,那么它们不会。可能你没有正确保存它。一旦他们是 .jpg,他们就会失去大部分他们拥有的信息,并且没有神奇的方法可以恢复它。

关于c++ - 如何将 JPG 图像读取为 CV_16UC1 并在屏幕上打印?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44267028/

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