如何以CV_16UC1的方式读取JPG图像并在屏幕上打印?
How to read JPG images as CV_16UC1 and print on screen?
我想在OpenCV
(C++
)上读取JPG
图像作为CV_16UC1
。
我也可以从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) 在新分辨率中仍然会很低,以至于看起来不存在。
"如何以CV_16UC1的方式阅读JPG图像并在屏幕上打印?">
你不能。.jpg图像只是不CV_16UC1。如果您生成了这些图像并认为它们将保存 16 位数据,则它们不会。可能您没有正确保存它。一旦他们被.jpg,他们就会丢失他们拥有的大部分信息,并且没有神奇的方法可以恢复它。
相关文章:
- DXGI 屏幕捕获扭曲的图像
- C++列出屏幕以在第二台显示器中显示图像
- 如何以CV_16UC1的方式读取JPG图像并在屏幕上打印?
- WXWIDGETS应用于WXStaticBitMap时,屏幕截图将大部分图像留为空白
- 在屏幕上查找图像
- Qt/C++图像未出现在屏幕上
- QT QML 中的 OpenGL,无法更新屏幕上的图像
- 将屏幕上的图像与模板图片匹配
- C++ 和 SDL 一次在屏幕上显示的图像不能超过 3 张
- 从C++中的屏幕选择创建位图时的黑色图像
- 如何在屏幕的一部分中插入图像
- SDL2图像到屏幕问题
- 屏幕截图仅返回黑色图像
- 如何在linux上对图像进行egl屏幕外渲染
- 在屏幕上绘制图像后背景发生变化
- 如何将屏幕图像放入内存缓冲区
- 如何使用 ASCII 代码在输出屏幕上显示图像C++
- 将渲染的图像克隆到窗口/屏幕中进行处理
- SDL 2通过SpriteManager在屏幕上显示图像,获得指针中断
- C++/SDL需要帮助才能在屏幕上显示图像