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

Posted

技术标签:

【中文标题】OpenCV:如何使用 cv::imwrite 保存图像而不覆盖它们【英文标题】:OpenCV: How to save images using cv::imwrite without overwriting them 【发布时间】:2018-12-15 21:05:20 【问题描述】:

我有一个保存图像的小应用程序using cv::imwrite。我遇到的问题是我一直在尝试找到一种方法来在匹配后存储裁剪的图像。我成功提取了裁剪后的图像,但它被覆盖在同一个文件夹中,而不是只是添加到文件夹中。 如何保存图像而不覆盖它们?

请看下面最重要的一段代码:

stereo.h

public:
    void cropMatches(int xa, int ya, int xb, int yb);

stereo.cpp

void StereoCal::cropMatches(int xa, int ya, int xb, int yb)
    cv::Point ptA=cv::Point(xa, ya);
    cv::Point ptB=cv::Point(xb, yb);
    cv::Size sz;
    sz.height=regionSize;
    sz.width=regionSize;

    cv::Mat regionA, regionB;
    cv::getRectSubPix(currentImages.getA().get8Bitmap(),sz,ptA,regionA);
    cv::getRectSubPix(currentImages.getB().get8Bitmap(),sz,ptB,regionB);
    std::string path = "/home/path/to/folder/";
    std::string outA = path+"cropA.tiff";
    std::string outB = path+"cropB.tiff";
    cv::imwrite(outA,regionA);
    cv::imwrite(outB,regionB);

请说明如何解决此问题。

【问题讨论】:

为每个图像选择单独的文件名。例如与 outA=path+std::to_string(counter++)+"_cropA.tiff";其中 counter 是一个整数变量,在全局某处初始化为 0 或作为参数提供给函数并在外部管理/递增。 顺便说一句。如果你想从那个函数中写入,你应该让用户可以选择路径和文件名。但我建议只将结果垫返回给用户并编写单独的函数以将图像保存到文件中。 嗨米卡,感谢您的帮助。我更改了代码,但我的问题仍然存在。在我运行第一个匹配并提取第一个裁剪后,我保存了两个图像,但是当我运行第二个匹配时,新的两个裁剪图像被覆盖在同一个文件夹中。我总是以两个图像结束,而不是越来越多的图像。以下是我如何将计数变量置零: std::string path = "/path/to/Desktop/croppedMatches/"; int i = 0, int j = 0; std::string outA = path+std::to_string(i++) + "_cropA.tiff"; cv::imwrite(outA,regionA); std::string outB = path+std::to_string(j++) + "_cropB.tiff"; cv::imwrite(outB,regionB); i 和 j 必须在函数之前知道,这样函数中的值才不会被设置为 0。您必须确保在第一次调用函数后为 1,在第二次调用后为 2,依此类推。 【参考方案1】:

在stereo.h中:

public:
void cropMatches(int xa, int ya, int xb, int yb);

private:
int counterA=0;
int counterB=0;

在stereo.cpp中

void StereoCal::cropMatches(int xa, int ya, int xb, int yb)
cv::Point ptA=cv::Point(xa, ya);
cv::Point ptB=cv::Point(xb, yb);
cv::Size sz;
sz.height=regionSize;
sz.width=regionSize;

cv::Mat regionA, regionB;
cv::getRectSubPix(currentImages.getA().get8Bitmap(),sz,ptA,regionA);
cv::getRectSubPix(currentImages.getB().get8Bitmap(),sz,ptB,regionB);
std::string path = "/home/path/to/folder/";
std::string outA = path+"cropA_"+std::to_string(counterA++)+".tiff";
std::string outB = path+"cropB_"+std::to_string(counterB++)+".tiff";
cv::imwrite(outA,regionA);
cv::imwrite(outB,regionB);

【讨论】:

以上是关于OpenCV:如何使用 cv::imwrite 保存图像而不覆盖它们的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV Python:如何避免 py3 中的 cv2.imwrite() 内存“泄漏”?

Python+OpenCV:cv2.imwrite

OpenCV 函数学习02-图像的保存(cv2.imwrite)

如何在循环中以不同的名称保存 cv::imwrite

Python-OpenCV:cv2.imread(),cv2.imshow(),cv2.imwrite()

OpenCV:使用 imwrite() 函数时无法编译