我正在尝试编写一个将平面场应用于图像的 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 都很陌生,所以我不完全确定我错过了什么。该线程似乎表明浮点值可能是原因。我可以转换出浮点数,但我需要保持源代码的 16 位特性。我试过image.convertTo( image, CV_16U );
在divide命令之后添加一行,两者CV_16U
都CV_8U
起作用,也不起作用。
非常感谢任何和所有帮助!
编辑
根据下面的建议,我尝试添加一些 imshow 命令来实际测试 opencv 是否正确处理事情。似乎一切正常,直到我执行除法命令。在那之后,我的图像数组最终是空白的。