gpt4 book ai didi

c++ - OpenCV imwrite 保存黑色 png

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:52:39 25 4
gpt4 key购买 nike

我正在尝试编写一个将平场应用于图像的 C++ 程序。它应该加载一个图像并将其除以另一个加载的图像,然后将其导出为 PNG。我的程序编译正确,但只生成全黑图像。

#include <climits>
#include <stdio.h>
#include <string>
#include <opencv/cv.h>
#include <opencv/highgui.h>

using namespace cv;
using namespace std;

int main( int argc, char *argv[] )
{
const char *flat_file = argv[1];
const char *img_file = argv[2];
const char *out_file = argv[3];

Mat flat_img;
flat_img = imread( flat_file, CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH );
Mat image;
image = imread( img_file, CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH );

GaussianBlur( flat_img, flat_img, cv::Size(3,3), 0, 0, BORDER_REPLICATE );
divide( image, flat_img, image, 1.0, -1 );
imwrite( out_file, image );

return 0;
}

所有输入文件都是 16 位 TIFF。目前,生成的输出文件是 16 位 PNG,具有正确的像素尺寸,但完全是黑色的。

我对 C++ 和 OpenCV 都很陌生,所以我不完全确定我错过了什么。 This thread似乎暗示浮点值可能是原因。我可以转换出 float ,但我需要保持源代码的 16 位特性。我试过在 divide 命令后添加一行 image.convertTo( image, CV_16U ); ,同时使用 CV_16UCV_8U 但都不起作用.

非常感谢任何帮助!

编辑

根据下面的建议,我尝试添加一些 imshow 命令来实际测试 opencv 是否正确处理了事情。似乎一切正常,直到我执行 divide 命令。之后,我的图像数组就变成了空白。

最佳答案

事实证明这确实是我的除法命令。我的代码一直基于同事编写的类似应用程序,所以我去看看他们是如何进行除法的。我不是 100% 确定这是要完成什么,但是当我将我的分界线更改为:

divide( image, flat_img, image, image.depth() == 16 ? UCHAR_MAX : USHRT_MAX );

只是进行预测,条件是根据图像的深度为我的数据设置标量。我仍然有一个挥之不去的问题是,我所拥有的和 divide( image, flat_img, image, image.depth() == 8 ? UCHAR_MAX : USHRT_MAX ); 之间的区别是什么。两者都产生了看似相同的图像。大多数情况下,我试图更好地理解正在发生的事情。

关于c++ - OpenCV imwrite 保存黑色 png,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13961789/

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