Технический форум по робототехнике.
public_void » 08 июн 2008, 16:41
Выдаёт ошибку во время выполнения. Вроде что-то с форматом цвета связано.
- Код: Выделить всё • Развернуть
void TForm1::BubbleContours(Graphics::TBitmap &bmp, Graphics::TBitmap &outputBmp)
{
IplImage *image = TBitmapToIplImage(&bmp);
IplImage* laplace = 0;
IplImage* colorlaplace = 0;
IplImage* planes[3] = { 0, 0, 0 };
// Laplacian
if( !laplace )
{
for(int i = 0; i < 3; i++ )
{
planes[i] = cvCreateImage( cvSize(image->width,image->height), 8, 1 );
}
laplace = cvCreateImage( cvSize(image->width,image->height), IPL_DEPTH_16S, 1 );
colorlaplace = cvCreateImage( cvSize(image->width,image->height), 8, 3 );
}
cvCvtPixToPlane( image, planes[0], planes[1], planes[2], 0 );
for(int i = 0; i < 3; i++ )
{
cvLaplace( planes[i], laplace, 3 );
cvConvertScaleAbs( laplace, planes[i], 1, 0 );
}
cvCvtPlaneToPix( planes[0], planes[1], planes[2], 0, colorlaplace );
colorlaplace->origin = image->origin;
// Contours
IplImage *edge = cvCreateImage( cvSize(image->width,image->height), IPL_DEPTH_8U, 3 );
IplImage *convertedImage = cvCreateImage( cvSize(image->width,image->height), IPL_DEPTH_8U, 3 );
cvCanny(convertedImage, edge, 50, 200, 3 ); //error here
IplImageToTBitmap(edge, &outputBmp);
}
Myp » 09 июн 2008, 09:58
да? как интересно...
а как ты догадался? телепатически? если нет то процитируй плиз текст ошибки сюда
ато пока я в отпуске тебе никто не поможет
public_void » 09 июн 2008, 19:03
во время выполнения этого алгоритма выдаёт следующее сообщение об ошибке
Unsupported format or combination of formats() in function cvCanny,
D:\User\VP\opecv\cv\src\cvcanny.cpp(262)
Press "Abort" to terminate application.
Press "Retry" to debug (if the app is running under debugger).
Press "Ignore" to continue (this is not safe).
hudbrog » 09 июн 2008, 19:20
Проверьте, что корректно отрабаывают cvCreateImage и, соответственно, указатели на имейджи не NULL.
И во-вторых, не ясно на чем именно вы собираетесь искать края (что собственно делает cvCanny), если вы ей подсовываете пустую тока что созданную картинку.
Ну и само собой у вас low_threshold стоит больше чем high_threshold, что есть несколько нелогично. Должно бы быть наоборот.
public_void » 10 июн 2008, 13:20
я пробовал изменить код вот так
- Код: Выделить всё • Развернуть
cvCvtPlaneToPix( planes[0], planes[1], planes[2], 0, colorlaplace );
colorlaplace->origin = image->origin;
// Contours
IplImage *edge = cvCreateImage( cvSize(image->width,image->height), IPL_DEPTH_8U, 3 );
cvCanny(colorlaplace, edge, 50, 200, 3 ); //error here
IplImageToTBitmap(edge, &outputBmp);
}
так же я менял в кэнни местами 50 и 200. Всё равно та же ошибка.
=DeaD= » 10 июн 2008, 16:25
Думается надо внимательно прочитать какие форматы изображений поддерживает cvCanny и тщательно проверить эти форматы перед передачей изображения в функцию.
DeBOBAHer » 11 июн 2008, 08:39
To avoid overflow, the function requires 16-bit destination image if the source image is 8-bit. The result can be converted back to 8-bit using cvConvertScale or cvConvertScaleAbs functions. Besides 8-bit images the function can process 32-bit floating-point images. Both source and destination must be single-channel images of equal size or ROI size.
Т.е. надо передавать как входной параметр изображение с
одним цветовым каналом. Большинство алгоритмических функций в OpenCV могут работать только с одноканальными изображениями (изображениями в градациях серого).
=DeaD= » 11 июн 2008, 11:42
И не только с 1 каналом, но еще и на вход 8бит, а на выходе должен быть приёмник 16бит, чтобы не было переполнения.
Оба условия, как очевидно, нарушены в приведенном выше программном коде.
public_void » 11 июн 2008, 13:37
А ка изображение из 3-х канального сконвертить в одноканальное
=DeaD= » 11 июн 2008, 13:46
public_void писал(а):А ка изображение из 3-х канального сконвертить в одноканальное
Есть такая полезная вещь, как COI (Channel Of Interest), подробнее пример применения, например, тут:
viewtopic.php?p=43041#p43041
public_void » 11 июн 2008, 21:10
спасибо, помогло.
Snuff1k » 31 май 2012, 13:32
вопрос, пишу #include <highgui.h>, а он мне ошибку [C++ Error] Unit1.cpp(5): E2209 Unable to open include file 'highgui.h', как можно решить ?