Ошибка OpenCV: размеры входных аргументов не совпадают - PullRequest
1 голос
/ 30 марта 2011

У меня странная проблема.Если я использую cvCvtColor для изображения, оно работает, но если я хочу изменить это изображение и использовать cvCvtColor для него, возникает ошибка:

Ошибка OpenCV: размеры входных аргументов не совпадают () в cvCvtColor, файл /build/buildd-opencv_2.1.0-3-i386-PaiiLK/opencv-2.1.0/src/cv/cvcolor.cpp, строка 2208 завершается, вызывается после создания экземпляра 'cv :: Exception'

Не должно быть этой ошибки, потому что у меня есть вывод:

targetImage-> width = 300, targetImage-> height = 300 cap-> width = 300, cap->высота = 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;
}

1 Ответ

0 голосов
/ 15 апреля 2011

Теперь у меня есть рабочая среда разработки, поэтому я должен опубликовать некоторый код.

Сообщение об ошибке в вашем вопросе показывает, что вы используете 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...