HCRM博客

为什么在使用findcontour时会出现报错?

在OpenCV中使用findContours函数时,可能会遇到各种报错或异常问题,这些问题通常与输入图像的格式、版本兼容性以及配置设置等有关,下面将详细介绍一些常见的错误及其解决方法,并提供相应的代码示例和解决方案:

常见错误及解决方法

为什么在使用findcontour时会出现报错?-图1
(图片来源网络,侵权删除)

| 错误描述 | 可能原因 | 解决方法 |

||||

|使用C++接口报错 | C++接口可能存在bug | 尝试使用C接口cvFindContours并对其进行封装。

#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
    Mat src = imread("path_to_image", IMREAD_GRAYSCALE);
    std::vector<std::vector<Point>> contours;
    std::vector<Vec4i> hierarchy;
    
    // 使用C接口
    CvSeq* pContour = NULL;
    int storageSize = 512; // 存储空间大小
    CvMemStorage* storage = cvCreateMemStorage(0);
    pContour = cvFindContours(src, storage, &pContour, sizeof(CvContour), storageSize, CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE);
    
    // 将CvSeq转换为std::vector
    for (int i = 0; i < pContour>total; i++) {
        CvPoint point;
        CV_SEQ_ELEM(point, pContour, i);
        contours.push_back(point);
    }
    
    // 继续处理轮廓...
    
    return 0;
}

|VS和OpenCV版本不兼容 | 不同版本的VS和OpenCV之间可能存在兼容性问题 | 尝试更换OpenCV版本,如从3.1.0改为3.0,确保运行时库设置正确,避免混装Debug和Release库文件。

// 项目属性 > 配置属性 > C/C++ > 代码生成 > 运行库 > 多线程调试 (/MTd)

|内存崩溃问题 | 运行时库设置不当可能导致内存崩溃 | 确保工程的运行时库设置为MD模式,而非MT模式,修改MFC的使用方式,将其设置为在共享DLL中使用。

// 项目属性 > 配置属性 > 常规 > MFC的使用 > 在共享DLL中使用MFC

|图像格式不正确 | 输入图像不是单通道二值图像 | 确保输入图像为单通道二值图像。

为什么在使用findcontour时会出现报错?-图2
(图片来源网络,侵权删除)
Mat src = imread("path_to_image", IMREAD_GRAYSCALE);
threshold(src, src, 128, 255, THRESH_BINARY);

|传入参数不正确 | findContours函数的参数设置不当 | 确保参数设置正确,如mode和method参数的选择。

findContours(src, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

|返回值处理错误 | Python中处理返回值不当 | 确保正确处理返回值,根据OpenCV版本选择适当的变量接收返回值。

OpenCV 3.x
_, contours, _ = cv2.findContours(image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
OpenCV 4.x
contours, _ = cv2.findContours(image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

常见问题解答(FAQs)

1、问题:在Windows平台上使用OpenCV的findContours函数时,程序为什么会崩溃?

答案:这通常是由于运行时库设置不当导致的,确保将工程的运行时库设置为MD模式,并将MFC的使用设置为在共享DLL中使用,检查输入图像的格式是否正确,确保其为单通道二值图像。

2、问题:在使用Python调用OpenCV的findContours函数时,为什么会报“ValueError: not enough values to unpack”错误?

为什么在使用findcontour时会出现报错?-图3
(图片来源网络,侵权删除)

答案:这个错误是由于OpenCV版本不同导致返回值的处理方式不同,在OpenCV 3.x中,findContours函数返回三个值,而在OpenCV 4.x中只返回两个值,根据你使用的OpenCV版本,正确处理返回值即可,对于OpenCV 3.x,可以使用以下代码:

_, contours, _ = cv2.findContours(image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

对于OpenCV 4.x,可以使用以下代码:

contours, _ = cv2.findContours(image, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
分享:
扫描分享到社交APP
上一篇
下一篇