65.9K
CodeProject 正在变化。 阅读更多。
Home

Mango,基于 OpenCV 的照片编辑器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (15投票s)

2008年12月10日

CPOL

3分钟阅读

viewsIcon

116327

downloadIcon

10351

一篇关于实现 OpenCV 基本用法来操作图片的文章

引言

我用 OpenCV 制作了一个简单但不错的照片编辑器。它可以用于编辑照片,例如添加简单效果、更改亮度和对比度、直方图均衡、人脸检测等。对于 GUI,我使用 wxWidgets,因此可以轻松移植到 Linux 操作系统。

背景

OpenCV 是一个用 C/C++ 编写的开源计算机视觉库。它为我们提供了许多用于图像数据操作的 API。它与操作系统无关,并针对实时应用程序进行了优化。前往 OpenCV 网站并下载最新版本。安装并检查示例目录。找到一些教程并享受。

wxWidgets 是一个与操作系统无关的开源 GUI 库。通过使用这个库,我们可以制作一个与操作系统无关的应用程序。请在此处查看 wxWidgets 网站

计划

这是计划。我们将制作一个照片编辑器软件,它能够

  • 将图像转换为灰度和黑白。
  • 根据其色彩空间对亮度和对比度进行通道调整。
  • 更改色彩空间:RGB、YCrCb、HSV 和 HLS。
  • 旋转、翻转或调整图像大小。
  • 进行直方图均衡化。
  • 显示直方图图。
  • 检测人脸。
  • 生成腐蚀和膨胀效果。
  • 具有“撤销”功能。

代码

用于图像操作的类分配在文件 mango.hmango.cpp 中,名为 CMango

class CMango
{

public:
    enum type{
        IM_AUTOMATIC,
        IM_GRAYSCALE,
        IM_BLACKNWHITE,
        IM_RGB,
        IM_HSV,
        IM_HLS,
        IM_YCrCb,
        IM_ZOOMIN,
        IM_ZOOMOUT,
        IM_HORIZONTAL = 25,
        IM_VERTICAL,
        IM_DILATE = 40,
        IM_ERODE,
        IM_FACE1,
    };

    CMango(void);
    ~CMango(void);

    int LoadImageFromFile(char *FileName);
    void ShowActiveImage(char *WindowName);
    int SetProperty();
    std::string GetProperty();
    void LoadPrestoredImage(int type);
    void PushImage(IplImage *Image){ImageList.push_front(Image);};
    void PopImage(){ if (!ImageList.empty()) ImageList.pop_front();};
    int SaveToFile(char *FileName);

    void Rotate(int angle);
    void ZoomImage(int flag);
    int GetImageElement(int channel, int brightness, int contrast);
    void FlipImage(int flag);
    void ApplyEffects(int flag);
    void FaceDetect(int flag);
    void ShowHistogram();
    int HistogramEqualization();
    int ChangeColorSpace(int flag);

private:
    static IplImage *Automatic;
    static IplImage *Blacknwhite;
    static IplImage *Grayscale;
    static IplImage *Buf;

    static std::list<IplImage *> ImageList;
    static std::list<std::string> PropertyList;

    static int ColorSpace;
};

加载图像后,它保存在数据成员 Automatic 中。实际上,我们这里有三个预先存储的图像:AutomaticBlacknwhiteGrayscale。我们执行的每个操作都会将活动图像(正在显示的图像)推送到 ImageList,这样我们就可以执行“撤销”。“撤销”命令基本上会将图像从 ImageList 中弹出以供显示。

我还在色彩空间上做了一些实验。根据图像的色彩空间调整其每个通道的亮度和对比度可以给我们带来很棒的效果。我使用了我在 该网站 上找到的算法。由于 OpenCV 仅将 RGB 放置在显示器上,因此我必须执行以下操作:将图像转换为目标色彩空间,进行我想要的调整,最后将其转换回 RGB 以进行显示。

不幸的是,我遇到了一个问题。问题是该算法适用于 RGB 色彩空间。我不能只将它用于其他色彩空间。但是,看看这个

    Range
RGB R 0 - 1
  G 0 - 1
  B 0 - 1
YCrCb Y 0 - 1
  Cr -0.5 - 0.5
  Cb -0.5 - 0.5
HSV H 0-360
  S 0 - 1
  V 0 - 1
HLS H 0-360
  L 0 - 1
  S 0 - 1

根据这张表,我认为可以对 RGB 以外的其他色彩空间应用相同的算法,只要它们在同一范围内即可。

请注意,我仅实现了 RGB 色彩空间的直方图曲线。如果更改色彩空间,由于范围不同,直方图曲线将不再有效。

关注点

我在这里实现了许多 OpenCV 的基本功能。我希望它对你开始学习 OpenCV 可能会有所帮助。

参考文献

© . All rights reserved.