【问题标题】:No suitable user-defined conversion from "cv::Mat" to "IplImage" exists不存在从“cv::Mat”到“IplImage”的合适的用户定义转换
【发布时间】:2021-02-22 04:44:40
【问题描述】:

我正在准备用这个特征在 pc 中将 cv::Mat 转换为 IplImage:

  • opencv:3.4.14
  • 操作系统:Win 10
  • 代码:c++

不同选项的示例:

cv::Mat MBin = cv::Mat::zeros(cv::Size(64, 64), CV_32FC1);

IplImage* image0= new IplImage(MBin);
IplImage image1 = MBin;
IplImage* image2 = cvCloneImage(&(IplImage)MBin);

IplImage* image3;
image3 = cvCreateImage(cvSize(MBin.cols, MBin.rows), 8, 3);
IplImage image4 = MBin;
cvCopy(&image4, image3);

出现 imageX 的地方会产生标题错误。

【问题讨论】:

  • 不要使用过时的 C api!
  • 这是一个有数百个类的代码,我不能改变所有的C api。
  • @SSR 不用,用 C++ API 就行了。

标签: c++ image visual-studio opencv visual-c++


【解决方案1】:

这是唯一不会产生编译错误的解决方案:

#include <opencv2/core/types_c.h>

Mat Img = imread("1.jpg");

IplImage IBin_2 = cvIplImage(MBin);
IplImage* IBin = &IBin_2;

【讨论】:

    【解决方案2】:

    opencv3.x 之前,Mat 有一个构造函数Mat(const IplImage* img, bool copyData=false);。但是在opencv3.xMat(const IplImage* img, bool copyData=false);的构造函数被取消了。

    所以,您可以参考以下示例将Mat 转换为IplImage

    //Mat—>IplImage
    //EXAMPLE:
    //shallow copy:
    Mat Img=imread("1.jpg");
    IplImage* pBinary = &IplImage(Img);
    //For a deep copy, just add another copy of the data:
    IplImage *input = cvCloneImage(pBinary)
    

    另外,您可以参考此link 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2013-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多