【问题标题】:OpenCV cvDrawContours vs drawContoursOpenCV cvDrawContours 与 drawContours
【发布时间】:2014-08-15 13:55:57
【问题描述】:

我是在 Visual Studio 上使用 OpenCV 的新手,我最近重新安装了我的 VS2012 以使其使用 OpenCV 2.4.2 工作。

我正在尝试计算通过鼠标单击顶点并将它们推送到 CvSeq* 指定的区域面积,以与 contourArea() 函数一起使用。

我目前正在尝试将一个空的 CvSeq* 解析为我的自定义鼠标回调函数的最后一个参数,以便我可以添加由 x 和 y 坐标形成的 CvPoint。但是,之后每当我尝试访问 CvSeq* 轮廓时,都会出现错误。所以在下面sn-p的代码中:

void CallBackFunc(int event, int x, int y, int flags, void* userdata)
{

    CvSeq* contour = (CvSeq*)userdata;
    CvPoint cur;
     if  ( event == EVENT_LBUTTONDOWN )
     {
          cout << "Left button of the mouse is clicked - position (" << x << ", " << y << ") saved as point" << endl;
          // save x,y as a contour point
          cur = cvPoint(x,y);
          cvSeqPush(contour, &cur);
...

我得到了正确的 cout 消息,但是在尝试使用 CvSeq* 绘制轮廓时出现这样的错误: opencvtest.exe 中 0x75E3812F 处未处理的异常:Microsoft C++ 异常:内存位置 0x001FF990 处的 cv::Exception。

这里有什么问题?尝试使用 Vector> 而不是 CvSeq 会更好吗?

【问题讨论】:

  • 只是好奇,如果您刚开始使用 OpenCV,为什么不从最新版本 (2.4.9) 而不是非常旧的版本 (2.4.2) 开始?
  • 遇到了一些安装问题,回到了有在线安装指南文档的版本

标签: c++ opencv visual-studio-2012 contour


【解决方案1】:
  • cvDrawContours() 来自旧的、已弃用的 c-api,您不应该使用它或任何旧的 cv* 函数。

  • drawContours 来自当前的 c++ api,与 cv::Mat 一起使用,函数来自 cv:: 命名空间。


另外,不要再担心 CvSeq* 或 IplImage*。如果您看到任何包含此类神秘内容的代码,请继续。

“尝试使用 vector&lt;vector&lt;Point&gt;&gt; 代替 CvSeq 会更好吗?” - 是的。


如果有疑问,请查看samplesdocs

【讨论】:

  • 非常感谢@berak!如果我的 Visual Studio 自动完成似乎显示 cvDrawContours() 而不是 drawContours(),这是否意味着我的设置有问题?
  • 这可能意味着您包含了 c-api 标头而不是 c++ 标头。请包括“opencv2/core/core.hpp”、“opencv2/highgui/highgui.hpp”等。
  • 嗯,奇怪...我刚刚检查过,这些正是我所包含的...这可能是版本问题吗?我正在使用 OpenCV2.4.2,已从最新版本恢复以尝试使其正常工作
  • 好的,确切地说是“opencv2/imgproc/imgproc.hpp”。并确保您没有包含较旧的标头,例如 cv.h before
  • 啊,现在可以了,非常感谢!有没有一种简单的方法可以搜索哪些函数包含在哪些头文件中?
猜你喜欢
  • 2019-09-15
  • 2015-08-05
  • 2019-02-01
  • 2012-07-25
  • 2015-10-07
  • 2016-06-24
  • 2018-10-28
  • 2016-09-12
  • 2015-10-15
相关资源
最近更新 更多