如何在 OpenCV 2.4.3 中保存(cvWrite 或 imwrite)图像?

Posted

技术标签:

【中文标题】如何在 OpenCV 2.4.3 中保存(cvWrite 或 imwrite)图像?【英文标题】:How to save (cvWrite or imwrite) an image in OpenCV 2.4.3? 【发布时间】:2013-04-10 18:26:24 【问题描述】:

我正在尝试将 OpenCV 图像保存到硬盘。

这是我尝试过的:

public void SaveImage (Mat mat) 
  Mat mIntermediateMat = new Mat();

  Imgproc.cvtColor(mRgba, mIntermediateMat, Imgproc.COLOR_RGBA2BGR, 3);

  File path =
    Environment.getExternalStoragePublicDirectory(
    Environment.DIRECTORY_PICTURES);
  String filename = "barry.png";
  File file = new File(path, filename);

  Boolean bool = null;
  filename = file.toString();
  bool = Highgui.imwrite(filename, mIntermediateMat);

  if (bool == true)
    Log.d(TAG, "SUCCESS writing image to external storage");
    else
    Log.d(TAG, "Fail writing image to external storage");
  

谁能展示如何使用 OpenCV 2.4.3 保存该图像?

【问题讨论】:

很可能您需要在清单中添加 sdcard 访问权限。 我没有在 android 手机上执行此操作。我刚刚从另一个趋势中得到了上面的示例,询问我正在询问 Android 手机的问题。我只想做的是,从使用与上述功能类似的功能作为新图像的面部检测代码,但在桌面而不是 Android 上使用 IplImage*。感谢您的回复。 Highgui 被版本 3 中的 Imgcodecs 替换。mRgba 实际上是输入垫。 ***.com/questions/25059576/… 【参考方案1】:

您的问题有点令人困惑,因为您的问题是关于桌面上的 OpenCV,但您的代码是针对 Android 的,您询问的是 IplImage,但您发布的代码使用的是 C++ 和 Mat。假设您使用 C++ 在桌面上,您可以执行以下操作:

cv::Mat image;
std::string image_path;
//load/generate your image and set your output file path/name
//...

//write your Mat to disk as an image
cv::imwrite(image_path, image);

...或者更完整的例子:

void SaveImage(cv::Mat mat)

    cv::Mat img;     
    cv::cvtColor(...); //not sure where the variables in your example come from
    std::string store_path("..."); //put your output path here       

    bool write_success = cv::imwrite(store_path, img);
    //do your logging... 

图像格式是根据提供的文件名选择的,例如如果您的 store_path 字符串是“output_image.png”,那么 imwrite 会将其保存为 PNG 图像。您可以在the OpenCV docs 查看有效扩展名列表。

使用 OpenCV 将图像写入磁盘时需要注意的一点是,缩放会因 Mat 类型而异;也就是说,对于浮点数,图像应在 [0, 1] 范围内,而对于无符号字符,它们将来自 [0, 256)。

对于 IplImages,我建议只是切换到使用 Mat,因为旧的 C 接口已被弃用。您可以通过cvarrToMat 将 IplImage 转换为 Mat,然后使用 Mat,例如

IplImage* oldC0 = cvCreateImage(cvSize(320,240),16,1);
Mat newC = cvarrToMat(oldC0);
//now can use cv::imwrite with newC

或者,您可以将 IplImage 转换为 Mat

Mat newC(oldC0); //where newC is a Mat and oldC0 is your IplImage

我还刚刚注意到 OpenCV 网站上的this tutorial,它为您提供了在(桌面)环境中加载和保存图像的演练。

【讨论】:

非常感谢。这就是我想要的,你已经回答了我的问题。我正在研究人脸识别,因为 openCv 2.4.3 有一个人脸识别器 API,与 openCV 版本 2.3.x 不同。将 IplImage* 更改为 cv::Mat 格式并将图像保存为垫子将使我的生活更轻松。因为 FaceRecognizer API 使用 cv::Mat 输入。非常感谢 alrikai。 很高兴听到它有帮助!我还建议您阅读他们网站 (opencv.org/documentation.html) 上的 OpenCV 文档,他们有很多很好的信息可以让您继续前进

以上是关于如何在 OpenCV 2.4.3 中保存(cvWrite 或 imwrite)图像?的主要内容,如果未能解决你的问题,请参考以下文章

ubuntu下如何安装opencv-2.4.3

如何使用带有 Code::Blocks 的 OpenCV 2.4.3 编译程序?

如何在python中保存selenium和opencv的部分截图

无法在 Windows 7 机器中使用 OpenCV 2.4.3、Python 2.7 打开“.mp4”视频文件

OpenCV:如何使用 cv::imwrite 保存图像而不覆盖它们

如何正确使用 cv2.imwrite 通过 cv2.selectROI 在 openCV 中保存图像