Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenCV imwrite保存黑色png 我试图写一个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; } #包括 #包括 #包括 #包括 #包括 使用名称空间cv; 使用名称空间std; int main(int argc,char*argv[]) { const char*flat_file=argv[1]; 常量字符*img_文件=argv[2]; const char*out_file=argv[3]; 垫平; flat_img=imread(flat_文件、CV_加载图像、任意颜色、CV_加载图像、任意深度); Mat图像; image=imread(img_文件、CV_LOAD_image_ANYCOLOR、CV_LOAD_image_ANYDEPTH); GaussianBlur(平坦img,平坦img,cv::Size(3,3),0,0,BORDER\u复制); 分割(图像,平面图像,图像,1.0,-1); imwrite(输出文件、图像); 返回0; }_C++_Opencv_Png_Tiff_16 Bit - Fatal编程技术网

OpenCV imwrite保存黑色png 我试图写一个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; } #包括 #包括 #包括 #包括 #包括 使用名称空间cv; 使用名称空间std; int main(int argc,char*argv[]) { const char*flat_file=argv[1]; 常量字符*img_文件=argv[2]; const char*out_file=argv[3]; 垫平; flat_img=imread(flat_文件、CV_加载图像、任意颜色、CV_加载图像、任意深度); Mat图像; image=imread(img_文件、CV_LOAD_image_ANYCOLOR、CV_LOAD_image_ANYDEPTH); GaussianBlur(平坦img,平坦img,cv::Size(3,3),0,0,BORDER\u复制); 分割(图像,平面图像,图像,1.0,-1); imwrite(输出文件、图像); 返回0; }

OpenCV imwrite保存黑色png 我试图写一个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; } #包括 #包括 #包括 #包括 #包括 使用名称空间cv; 使用名称空间std; int main(int argc,char*argv[]) { const char*flat_file=argv[1]; 常量字符*img_文件=argv[2]; const char*out_file=argv[3]; 垫平; flat_img=imread(flat_文件、CV_加载图像、任意颜色、CV_加载图像、任意深度); Mat图像; image=imread(img_文件、CV_LOAD_image_ANYCOLOR、CV_LOAD_image_ANYDEPTH); GaussianBlur(平坦img,平坦img,cv::Size(3,3),0,0,BORDER\u复制); 分割(图像,平面图像,图像,1.0,-1); imwrite(输出文件、图像); 返回0; },c++,opencv,png,tiff,16-bit,C++,Opencv,Png,Tiff,16 Bit,所有输入文件都是16位TIFF。目前,生成的输出文件是一个16位PNG,具有正确的像素尺寸,但完全是黑色的 我对C++和OpenCV都很陌生,所以我不太清楚我缺了什么。似乎表明浮点值可能是原因。我可以转换出浮点,但我需要保持源代码的16位特性。我尝试添加一行image.convertTo(image,CV_16U)

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

我对C++和OpenCV都很陌生,所以我不太清楚我缺了什么。似乎表明浮点值可能是原因。我可以转换出浮点,但我需要保持源代码的16位特性。我尝试添加一行
image.convertTo(image,CV_16U)CV_16U
CV_8U
进行编码,两者都不起作用

非常感谢您的任何帮助

编辑


根据下面的建议,我尝试添加一些imshow命令来实际测试opencv是否正确地处理事情。看来在我命令之前一切都很顺利。在那之后,我的图像数组就变成了空白。

答案可能是您已经正确地显示了图像,因为如果您使用普通的图像浏览器打开16位图像,它通常会完全变暗,因为它们只支持正确显示8位图像

要解决这个问题,首先尝试使用OpenCV highgui显示16位图像。
你可以做
imshow(“测试”,图像);等待键(0)
并查看图像是否正确显示。如果是这样,您可以通过
Mat img8bit将图像转换为8bit;image.convertTo(img8bit,CV8U,255./65535)并编写这个新的Mat。

结果证明它确实是我的divide命令。我的代码是基于一位同事编写的类似应用程序编写的,所以我去看看他们是如何进行划分的。我不是100%确定这是实现了什么,但当我将我的划分改为以下内容时,它会起作用:

divide(图像,平面图像,图像,图像.depth()==16?UCHAR\u MAX:USHRT\u MAX)


只是做一个预测,这个条件是根据图像的深度为我的数据设置标量。我仍然有一个挥之不去的问题,那就是我所拥有的和划分(图像、平面图像、图像、图像.深度()==8?UCHAR\u MAX:USHRT\u MAX)之间有什么区别将是。两者产生的图像似乎相同。大多数情况下,我只是想更好地理解发生了什么。

我以为你指的是imshow而不是imwrite,所以我测试了一下。:)无论如何,这也返回了一个空白图像,所以我开始在过程中的每个步骤后放置imshow。这两幅图像都能正确加载,高斯模糊也能正常工作。看起来分割函数就是图像丢失的地方。你错了
imshow()
可以正确处理16位图像。它会自动将它们转换为8位。From:如果图像是16位无符号或32位整数,则像素除以256。也就是说,值范围[0255*256]映射到[0255]。image.depth()的值是多少?在第一种情况下,如果为16,则输入图像将乘以UCHAR_MAX(否则乘以USHRT_MAX),然后再除以flat_image。在第二种情况下,用8代替上一句中的16。我认为这两个函数产生相同输出的唯一方法是如果
image.depth()
既不是8也不是16。