FindContour OpenCV C ++

时间:2017-02-08 18:19:07

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

从opencv使用findContour()函数时遇到问题。它崩溃并输出以下错误:

enter image description here

这是我的代码:

using namespace cv;
using namespace std;

Mat src; Mat src_gray;
int thresh = 100;
int max_thresh = 255;
RNG rng(12345);

/// Function header
void thresh_callback(int, void*);

/** @function main */
int main(int argc, char** argv)
{
    src = imread("test.png");
    /// Load source image and convert it to gray
    //src = imread(argv[1], 1);

    /// Convert image to gray and blur it
    cvtColor(src, src_gray, CV_BGR2GRAY);
    blur(src_gray, src_gray, Size(3, 3));

    /// Create Window
    char* source_window = "Source";
    namedWindow(source_window, CV_WINDOW_AUTOSIZE);
    imshow(source_window, src);

    createTrackbar(" Canny thresh:", "Source", &thresh, max_thresh, thresh_callback);
    thresh_callback(0, 0);

    waitKey(0);
    return(0);
}

/** @function thresh_callback */
void thresh_callback(int, void*)
{
    Mat canny_output;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;

    /// Detect edges using canny
    Canny(src_gray, canny_output, thresh, thresh * 2, 3);
    /// Find contours
    findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

    /// Draw contours
    Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3);
    for (int i = 0; i< contours.size(); i++)
    {
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
        drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
    }

    /// Show in a window
    namedWindow("Contours", CV_WINDOW_AUTOSIZE);
    imshow("Contours", drawing);
}

所有设置都是正确的,例如属性表,因为程序可以正常工作但是一旦完成thresh_callback功能就会崩溃。 我使用visual studio 2015和opencv 3.0。我曾尝试过visual studio 2012或尝试其他版本的opencv,如2.4.9。不幸的是,它仍然不起作用。希望你们都能帮助我

这里显示了我的属性表设置: 1.调试x64属性表 Debug x64 property sheet

  1. 发布x64属性表 Release x64 property sheet
  2. 我可以运行其他图像处理功能,例如cv::imread。只有findContour()有错误。

    更新

    库路径: enter image description here

2 个答案:

答案 0 :(得分:0)

我已经测试了你的代码,我可以针对我的输入图像(手的二进制图像)成功编译它,它确实提供了手的轮廓。正如@Miki所提到的,您必须检查链接的库。在Eclipse IDE上,我们必须转到:Project - &gt;属性 - &gt; C / C ++ Build - &gt;设置。在右侧,确保您使用的是工具设置&#39;选项卡,然后前往MinGW C ++ Linker - &gt;库。您必须在Visual Studio上有类似的东西,无论哪种方式,您仍然需要在项目设置中检查项目中包含的库。除了其他强制库之外,您必须具有以下链接库:

  1. libopencv_imgproc300
  2. libopencv_highgui300
  3. 请注意,数字300表示OpenCV版本是3.0,我有OpenCV 3.1,因此我的库包含最后的数字310,例如 - libopencv_imgproc310。如果这有帮助,请告诉我。

答案 1 :(得分:0)

您正在链接错误的库。

您正在链接:

  

C:\ opencv \ build \ x64 \ vc12 \ lib

这意味着您正在使用使用vc12编译器(Visual Studio 2013)编译的OpenCV。但您正在使用Visual Studio 2015,因此您需要链接到使用vc14编译的OpenCV。

所以,看看你是否有文件夹:

  

C:\ opencv \ build \ x64 \ vc14 \ lib

可能不是,因为OpenCV 3.0没有vc14的预建。在这种情况下,你可以:

  1. 使用vc14重新编译OpenCV 3.0
  2. 下载OpenCV 3.2 ,其中包含x64,vc14的预建二进制文件。这是推荐的方法,因为OpenCV 3.2添加了一些不错的功能,并修复了一些错误。
  3. 将Visual Studio 2013与当前库一起使用