2011-03-30 4 views
1

이상한 문제가 있습니다. 내가 이미지를 cvCvtColor를 사용하는 경우 그것은 작동하지만 난 그것에 cvCvtColor을 해당 이미지를 수정하고 사용하려는 경우 오류가 :OpenCV 오류 : 입력 인수의 크기가 일치하지 않습니다.

: 내가 출력으로 가지고 있기 때문에

OpenCV Error: Sizes of input arguments do not match() in cvCvtColor, file /build/buildd-opencv_2.1.0-3-i386-PaiiLK/opencv-2.1.0/src/cv/cvcolor.cpp, line 2208 terminate called after throwing an instance of 'cv::Exception'

이 오류가 없어야합니다

targetImage->width =300, targetImage->height =300 cap->width =300, cap->height =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; 
} 
+0

는 서브 이미지의 코드를 게시 할 수 있습니까? – razlebe

+0

방금 ​​지연에 대해 귀하의 의견을 보았습니다;) – marinila

+0

'widthStep'과'imageSize'가 둘 다 올바르지 않다고 생각합니다. 서브 우퍼 때문에 새로운 이미지의 크기에 따라 다시 계산해야합니다. –

답변

0

지금 작업 dev에 환경을, 그래서 나는 몇 가지 코드를 게시해야한다.

질문에 나타난 오류 메시지는 OpenCV 2.1을 사용하고 있음을 보여줍니다. 내가 OpenCV 2.2에서 코드 샘플을 시도하고 잘 작동, 귀하의 subImage 예상대로 작동하는 것 같습니다. CvRect &r 매개 변수가 너비, 높이 (P1에서 P2와 반대) 인 X, Y로 작동하지만 아래는 내가 노력 코드입니다 (약간의 수정,하지만 바로 그 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; 
} 
관련 문제