OpenCV 错误:输入参数的大小不匹配

Posted

技术标签:

【中文标题】OpenCV 错误:输入参数的大小不匹配【英文标题】:OpenCV Error: Sizes of input arguments do not match 【发布时间】:2011-03-30 16:30:31 【问题描述】:

我有一个奇怪的问题。如果我在图像上使用 cvCvtColor,它可以工作,但如果我想修改该图像并在其上使用 cvCvtColor,则会出现错误:

OpenCV 错误:输入参数的大小 不匹配 () 在 cvCvtColor, 文件 /build/buildd-opencv_2.1.0-3-i386-PaiiLK/opencv-2.1.0/src/cv/cvcolor.cpp, 第 2208 行终止后调用 抛出一个实例 'cv::异常'

不应该有这个错误,因为我有输出:

targetImage->width =300, targetImage->height =300 cap->width =300, 上限->高度 =300

即:大小相同。所以是废话。。 任何可能的解决方案的想法?

相关代码在这里:

printf("\ntargetImage->width =%d, targetImage->height =%d ",targetImage->width,targetImage->height );

cap = cvCreateImage(cvSize(targetImage->width,targetImage->height), IPL_DEPTH_8U, 1);
cvCvtColor(targetImage, cap, CV_BGR2GRAY);//HERE NO PROBLEM

CvRect xargetRect = cvRect(0,0,300,300);
subImage(targetImage, &showImg, xargetRect);
cap = cvCreateImage(cvSize(targetImage->width,targetImage->height), IPL_DEPTH_8U, 1);
printf("\ntargetImage->width =%d, targetImage->height =%d ",targetImage->width,targetImage->height );
printf("\ncap->width =%d, cap->height =%d ",cap->width,cap->height );
cvCvtColor(targetImage, cap, CV_BGR2GRAY); //HERE THE PROBLEM

谢谢

这是子图代码:

/// Modifies an already allocated image header to map
/// a subwindow inside another image.
inline void subImage(IplImage *dest, const IplImage *orig, const CvRect &r) 
   dest->width = r.width;
   dest->height = r.height;
   dest->imageSize = r.height * orig->widthStep;
   dest->imageData = orig->imageData + r.y * orig->widthStep + r.x * orig->nChannels;
   dest->widthStep = orig->widthStep;
    dest->roi = NULL;
   dest->nSize = sizeof(IplImage);
    dest->depth = orig->depth;
    dest->nChannels = orig->nChannels;
   dest->dataOrder = IPL_DATA_ORDER_PIXEL;

【问题讨论】:

能贴出subImage的代码吗? 我刚刚看到你的评论,抱歉耽搁了;) 我认为您的widthStepimageSize 都不正确,由于子窗口,您将不得不根据新图像的尺寸重新计算。 另见this example获取子图像的一些不同代码。 【参考方案1】:

我现在有一个可以工作的开发环境,所以我应该发布一些代码。

您问题中的错误消息表明您使用的是 OpenCV 2.1。我在 OpenCV 2.2 中尝试了代码示例,它工作得很好,你的 subImage 似乎按预期工作。尽管CvRect &r 参数作为 X,Y 具有宽度、高度(而不是 P1 到 p2)。下面是我尝试过的代码(稍作修改,但完全相同subImage):

#include "cv.h"
#include "highgui.h"

/// Modifies an already allocated image header to map
/// a subwindow inside another image.
inline void subImage(IplImage *dest, const IplImage *orig, const CvRect &r)

    dest->width = r.width;
    dest->height = r.height;
    dest->imageSize = r.height * orig->widthStep;
    dest->imageData = orig->imageData + r.y * orig->widthStep + r.x * orig->nChannels;
    dest->widthStep = orig->widthStep;
    dest->roi = NULL;
    dest->nSize = sizeof(IplImage);
    dest->depth = orig->depth;
    dest->nChannels = orig->nChannels;
    dest->dataOrder = IPL_DATA_ORDER_PIXEL;


int _tmain(int argc, _TCHAR* argv[])

    IplImage targetImage;
    IplImage* showImg = cvLoadImage("c:\\image11.bmp");

    //printf("\ntargetImage->width =%d, targetImage->height =%d ", targetImage->width, targetImage->height );

    //IplImage* cap = cvCreateImage(cvSize(targetImage->width, targetImage->height), IPL_DEPTH_8U, 1);
    //cvCvtColor(targetImage, cap, CV_BGR2GRAY);//HERE NO PROBLEM

    CvRect xargetRect = cvRect(100, 100, 100, 100);
    subImage(&targetImage, showImg, xargetRect);
    IplImage* cap = cvCreateImage(cvSize(targetImage.width, targetImage.height), IPL_DEPTH_8U, 1);
    printf("\ntargetImage->width =%d, targetImage->height =%d ", targetImage.width, targetImage.height );
    printf("\ncap->width =%d, cap->height =%d ", cap->width, cap->height );
    cvCvtColor(&targetImage, cap, CV_BGR2GRAY); //HERE THE PROBLEM

    int result = cvSaveImage("c:\\image11.output.bmp", &targetImage);

    return 0;

【讨论】:

以上是关于OpenCV 错误:输入参数的大小不匹配的主要内容,如果未能解决你的问题,请参考以下文章

opencv-python addWeighted() 错误 - 输入参数的大小不匹配

cvcalcopticalflowbm opencv 2.4.7 中输入参数的大小不匹配

OpenCV - 输入参数的大小不匹配 - addWeighted

openCV Mat问题“输入参数的大小不匹配”

bitwise_and 输入参数的大小不匹配

OpenCV inRange 更改 Mat 类型