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的代码吗? 我刚刚看到你的评论,抱歉耽搁了;) 我认为您的widthStep
和imageSize
都不正确,由于子窗口,您将不得不根据新图像的尺寸重新计算。
另见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 中输入参数的大小不匹配