【问题标题】:How to return more than one image from a function?如何从一个函数返回多个图像?
【发布时间】:2012-10-24 00:50:39
【问题描述】:

我觉得我在做从函数返回图像的效率不高的方法。

如果我使用,

void processImg(IplImage* srcImg, IplImage* dstImg1, IplImage* dstImg2)
{
....processing image
cvCopy(..., dstImg1);
cvCopy(..., dstImg2);
}

对于上面的例子,我怎样才能返回两个图像呢?

如果我使用 IplImage*processImg(IplImage* srcImg, IplImage* dstImg1, IplImage* dstImg2),它只能返回一个图像。

如何根据这两个函数返回图片?

【问题讨论】:

  • 您在问题中列出的函数需要指向 dstImg1 和 dstImg2 的指针,如果您同时填写这两个(就像您使用 cvCopy 所做的那样),那么它们将在函数返回后保留其内容并且您拥有有效地“返回”了他们两个。您能否更具体地说明问题所在?
  • 我是否以正确的方式从函数中返回两个图像?我看到一些帖子这不是编程的好习惯。
  • C 和 C++ 不能有超过 1 个返回参数,如果是关于 C 或 C++ 的帖子,我会很感兴趣...
  • 我忘记了刚才在哪里看到的。我给出的例子实际上是有效的。我只是想知道这是否是一个好方法。例如,如果我们想返回多个值,最好的方式是通过引用传递等......
  • 我是 OpenCV 的新手,所以不确定我是否能提供最好的建议,但这里有一些值得考虑的想法: 1. 返回一个包含这两者的数组或 IplImage* 类型向量图片。 2. 根据您需要稍后使用图像的方式,您可以 cvAdd 它们(尽管这是一种破坏性的过程)或创建具有多个通道的矩阵(例如,对于 2 个 RGB 图像,您将创建一个具有 6 个通道的输出矩阵( 2xRGB),但这意味着制作一个具有两个图像中最大尺寸的矩阵,如果两个图像具有不同的尺寸,则会浪费“空间”)......

标签: opencv


【解决方案1】:

你正在做的工作。您正在传递指向两个 dst 图像的指针。这意味着如果您修改这些图像,您实际上是在修改原始图像。

如果这不是您要查找的内容并且您确实想要返回两个图像,您可以探索其他数据结构,例如列表或链表。您可以将这两个图像放在该结构中并返回该结构。

std::list<IplImage *> processImg(IplImage* srcImg)
{
    std::list<IplImage *> image_list;

    //....processing image

    //create two ipl images pointers
    IplImage *dstImg1, *dstImg2;

    //allocate memory for the ipl images

    //copy the data into images
    cvCopy(..., &dstImg1);
    cvCopy(..., &dstImg2);

    //add the images to list
    image_list.push_back(dstImg1);
    image_list.push_back(dstImg2);

    return image_list;
 }

【讨论】:

  • "您正在传递指向两个 dst 图像的指针。这意味着如果您修改这些图像,您实际上是在修改原始图像。"我理解你在这里的意思,但是“你真的想返回两个图像,你可以探索其他数据结构,如列表或链表。你可以将这两个图像放在那个结构中并返回结构。”我真的不明白这里。你能解释一下吗?
  • 除了Nick之外,std::list没有“add”的成员函数
  • 使用 push_back 而不是 add。
  • 数据结构是相似数据类型的集合。它可以是数组、向量、列表、地图、图形等任何东西。其中每一个都有自己的一组属性。如果你对列表不熟悉,可以把它们放在一个向量中,然后返回这个向量。
猜你喜欢
  • 2023-02-26
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 2019-03-29
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
相关资源
最近更新 更多