OpenCV 序列——如何创建点对序列?

Posted

技术标签:

【中文标题】OpenCV 序列——如何创建点对序列?【英文标题】:OpenCV sequences -- how to create a sequence of point pairs? 【发布时间】:2011-08-08 16:05:41 【问题描述】:

我正在尝试在 OpenCV 中创建一个空序列 (CvSeq),其结构类似于 cvHoughLines2(在 CV_HOUGH_PROBABILISTIC 中使用时)返回的序列 - 一系列点对.

我找到了一种制作(未连接)点序列的方法(我希望这对于点序列是正确的):

CvMemStorage *memStorage = cvCreateMemStorage(0);
CvSeq* seq = cvCreateSeq(
             CV_SEQ_FLAG_SIMPLE | CV_SEQ_KIND_SET | CV_SEQ_ELTYPE_POINT,
             sizeof(CvSeq), sizeof(CvPoint), memStorage); 

但是查看可用于创建CvSeq 的标志,我找不到任何可以用来构造其元素为点对的序列的东西。我想以与访问从霍夫变换获得的行相同的方式访问我创建的序列的元素:

for (int i=0; i < mylines->total; ++i)
    CvPoint *line = (CvPoint *)cvGetSeqElem(mylines, i);

    ...

    ... line[0].x ...
    ... line[1].y ... 

    ...

另外,如何按这样的顺序插入元素? :/

问题的原因是我已经有一个相当复杂的函数在 CvSeq 函数返回的行上运行 cvHoughLines2() 函数,我想在图片中创建的一些任意行上使用它(测试目的等...)。我到处寻找类似问题的答案,但找不到任何东西...... :(

非常感谢大家的帮助!

编辑:找到解决方案。

看起来唯一需要做的就是完全省略标志,表明您不会使用任何预定义的类型(例如点),只需给出正确大小的序列组件:

CvMemStorage *memStorage = cvCreateMemStorage(0);
CvSeq* seq = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvPoint)*2, memStorage);

我可以通过将指向 2 点数组的指针传递给 push 函数来添加存储:

CvPoint points[2];
... (initialize the points) ...
cvSeqPush(seq, &points);

这样我可以像访问霍夫变换的输出一样访问序列。

【问题讨论】:

您好 Penelope,如果您使用 C++,请学习 OpenCV 的 C++ API。 顺便说一句。 +1 回来提出解决方案! ypnos,我知道我可能应该为我未来的项目学习 C++ OpenCV API,但我仅有的纸质文献是 2008 年的 Bradski Kaehler 书(只有 C API)。而且我真的很难从在线资料中学到很多东西:( opencv.itseez.com,最新的opencv文档 @penelope 请添加您的编辑作为答案,然后接受它。 (您可以接受自己的答案。)这样就可以很容易地找到遇到同样问题的其他人。 【参考方案1】:

在寻找解决方案以提供帮助 20 分钟后,我阅读了整个问题并找到了解决方案编辑。 复制并粘贴,以便从未回答的中找出这个问题。

看起来唯一需要做的就是完全省略标志,这表明您不会使用任何预定义的类型(例如点),只需提供正确的大小序列组件的:

CvMemStorage *memStorage = cvCreateMemStorage(0);
CvSeq* seq = cvCreateSeq(0, sizeof(CvSeq), sizeof(CvPoint)*2, memStorage);

我可以通过将指向 2 点数组的指针传递给 push 函数来添加存储:

CvPoint points[2];
... (initialize the points) ...
cvSeqPush(seq, &points);

这样我可以像访问霍夫变换的输出一样访问序列。

【讨论】:

这应该是对用户问题的评论,告诉他添加他的解决方案作为答案,然后接受它。我很想拒绝你的回答,@robermorales @karlphillip,已经有评论和编辑。但是没有深入研究,我发现自己在寻找一个不需要的答案,避免我帮助别人。我认为这是一个更好的选择,而不是为了我的声誉,因为它将问题排除在“未回答”列表之外。 我知道,我阅读了整个问题并在回答您的答案并告诉您之前对该评论投了赞成票。生活和学习,我亲爱的朋友,现在你知道了,将来只要注意被问到的问题,你就会节省很多时间和痛苦。我不同意你的看法。该用户似乎对该站点做出了贡献,并且可能会回来解决此问题。我们不需要在这里复制/粘贴他的答案。

以上是关于OpenCV 序列——如何创建点对序列?的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 如何序列化opencv矩阵

OpenCV 3 和 ArUco lib - 序列化字典

如何使用适用于 Android 的 OpenCV 减少实时视频序列中的运动效果?

c ++如何将视频序列放入OpenCV中的vector<Mat>?

在 OpenCV 中将视频序列插入到另一个视频

如何在 Flutter 插件中添加 OpenCV