【问题标题】:I was wondering if you could tell me about the difference between imread and cvLoadImageM我想知道你能否告诉我 imread 和 cvLoadImageM 之间的区别
【发布时间】:2013-08-29 05:38:49
【问题描述】:

Mat img=imread("box.png",1);

Mat img=cvLoadImage("box.png",1);

当我尝试前一个时,项目无法加载文件,但当我使用后一个时,它会加载。所以.. box.png 在项目文件夹中。你能帮我看看我的imread有什么问题吗?还是应该添加 box.png 所在的目录?

我试图做的是这段代码从图像中提取 mser 区域。当编译器无法加载图像文件时,运行代码时发生错误,即使我已将 imread 更改为 cvLoadImageM 代码停止在

ms(box, region, Mat());

我是不是做错了什么?????????这里

#include <stdio.h>
#include <iostream>
#include <vector>
//#include <string.h>
#include "opencv\cv.h"
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;


int main()
{
    Mat box = imread("01a.png",1);
    if(box.empty()) 
    { 
        fprintf(stderr, "Can not load image" ); 
        return -1; 
    } 
    MSER ms;
    vector<vector<Point>> regions;
    ms(box, regions, Mat());
    for (int i = 0; i < regions.size(); i++)
    {
        ellipse(box, fitEllipse(regions[i]), Scalar(255));
    }
    imshow("mser", box);
    waitKey(0);
    return 0;
}

【问题讨论】:

  • 函数 imread 工作正常,我一直在使用它。您是遇到错误还是发生了其他事情?
  • 这个加载图像的代码很好。如果图像的大小很大,则 MSER 特征检测可能需要几秒钟。它会回来吗?您的代码在我的机器上编译并运行良好。
  • 不,当我运行代码时,它首先进入 if 部分并停止,如果我使用 cvLoadImageM 进行调整,然后再次运行它,它会显示一条错误消息,“0x77C4AA3C(ntdll.dll )에(mser_component_extractor.exe의) 例外情况.. 0xC0000374:堆已损坏(变量:0x77C5FE38)。(我使用的是韩语界面,所以我不知道如何将消息翻译成英文,但如果我这样做..它有点像上面)

标签: c++ opencv


【解决方案1】:

我昨天遇到了同样的问题,我找到了解决方案。确保使用的 opencv 库与每个 opencv 库的构建模式匹配(例如,Release -> cvcore242.lib (dll) Debug -> cvcore242d.lib(或 dll))。确保更改您的项目 deps->linker->dependencies 以加载正确的(调试或发布)opencv 库。

另一种方法是切换您的构建模式 Debug Release,但我想从长远来看,您希望使用适当的 opencv 库设置每种构建模式。

【讨论】:

    【解决方案2】:

    imread() 是新 OpenCV C++ 接口的一部分,与 Mat 结构一起使用。 cvLoadImage() 是一个 C 函数,它返回一个 IplImage*(指向 IplImage 的指针)

    【讨论】:

    • 是的,我知道 cvLoadImage 和 imread 之间的区别..我问的是不同的事情..;;
    【解决方案3】:

    就像 Cricketer 所说的 cvLoadImage() 返回一个指向图像的指针。 在你的代码中改变它

        - Mat box = imread("01a.png",1);
    
        + IplImage* pBox = cvLoadImage("01a.png");
        + Mat box = pBox;
    

    代码对我来说都很好,可以输入图像的完整路径

    "C:\\Users\\noob\\Pictures\\01a.png"
    

    【讨论】:

      【解决方案4】:

      所以,imread 失败了,您尝试使用 cvLoadImage 解决该问题吗?呸,不,不要那样做。

      请检查一下,如果您正在混合调试和发布代码,例如链接到发布构建或其他方式的 *d.libs。这很可能与此有关

      【讨论】:

        猜你喜欢
        • 2011-11-03
        • 1970-01-01
        • 1970-01-01
        • 2017-05-12
        • 1970-01-01
        • 2023-02-07
        • 2016-08-24
        • 1970-01-01
        • 2012-12-23
        相关资源
        最近更新 更多