Перейти к содержимому
Compvision.ru
nagoHok

cvLoadImage возращает NULL

Recommended Posts

Всем добрый день!

Только что скачал OpenCV 2.1 и приступил к изучению.

и сразу непонятные ситуация, взял из инета пример для пробы изменив в нем название изображение

и при загрузке изображение cvLoadImage возращает 0, пробовал другие форматы работает.

В чем может быть проблема?

TIFF задекларирован как подерживаемый формат.

Спасибо за рание.

ЗЫ среда MSVS 2008.


#include <cv.h>

#include <highgui.h>

#include <stdlib.h>

#include <stdio.h>


IplImage* image = 0;

IplImage* src = 0;


int main(int argc, char* argv[])

{

        // имя картинки задаётся первым параметром

        CStringA strPathName("c:\\Doc.tif");

        // получаем картинку

        image = cvLoadImage(strPathName,1); //Возращает NULL

        // клонируем картинку 

        src = cvCloneImage(image);


        printf("[i] image: %s\n", filename);

        assert( src != 0 );


        // окно для отображения картинки

        cvNamedWindow("original",CV_WINDOW_AUTOSIZE);


        // показываем картинку

        cvShowImage("original",image);


        // выводим в консоль информацию о картинке

        printf( "[i] channels:  %d\n",        image->nChannels );

        printf( "[i] pixel depth: %d bits\n",   image->depth );

        printf( "[i] width:       %d pixels\n", image->width );

        printf( "[i] height:      %d pixels\n", image->height );

        printf( "[i] image size:  %d bytes\n",  image->imageSize );

        printf( "[i] width step:  %d bytes\n",  image->widthStep );


        // ждём нажатия клавиши

        cvWaitKey(0);


        // освобождаем ресурсы

        cvReleaseImage(&image);

        cvReleaseImage(&src);

        // удаляем окно

        cvDestroyWindow("original");

        return 0;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем добрый день!

Только что скачал OpenCV 2.1 и приступил к изучению.

и сразу непонятные ситуация, взял из инета пример для пробы изменив в нем название изображение

и при загрузке изображение cvLoadImage возращает 0, пробовал другие форматы работает.

В чем может быть проблема?

TIFF задекларирован как подерживаемый формат.

Спасибо за рание.

ЗЫ среда MSVS 2008.


#include <cv.h>

#include <highgui.h>

#include <stdlib.h>

#include <stdio.h>


IplImage* image = 0;

IplImage* src = 0;


int main(int argc, char* argv[])

{

        // имя картинки задаётся первым параметром

        CStringA strPathName("c:\\Doc.tif");

        // получаем картинку

        image = cvLoadImage(strPathName,1); //Возращает NULL

        // клонируем картинку 

        src = cvCloneImage(image);


        printf("[i] image: %s\n", filename);

        assert( src != 0 );


        // окно для отображения картинки

        cvNamedWindow("original",CV_WINDOW_AUTOSIZE);


        // показываем картинку

        cvShowImage("original",image);


        // выводим в консоль информацию о картинке

        printf( "[i] channels:  %d\n",        image->nChannels );

        printf( "[i] pixel depth: %d bits\n",   image->depth );

        printf( "[i] width:       %d pixels\n", image->width );

        printf( "[i] height:      %d pixels\n", image->height );

        printf( "[i] image size:  %d bytes\n",  image->imageSize );

        printf( "[i] width step:  %d bytes\n",  image->widthStep );


        // ждём нажатия клавиши

        cvWaitKey(0);


        // освобождаем ресурсы

        cvReleaseImage(&image);

        cvReleaseImage(&src);

        // удаляем окно

        cvDestroyWindow("original");

        return 0;

}

Привет.

Попробуйте проверить существование файла (exists) за вказанным Вами путём.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

добавил проверку

CStringA strPathName("c:\\Doc.tif");

if(!PathFileExistsA(strPathName))

		return -1;

image = cvLoadImage(strPathName,1); //Возращает NULL

Файл присутствует но не загружается...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

OpenCV поддерживает tiff. Для этого существует проект libtiff, который создаёт статическую библиотеку, влинковывающуюся в highgui.dll

Но! Всё это происходит, если была установлена опция HAVE_TIFF препроцессора при компиляции highgui.dll

Кажется, использование libtiff также указывается в CMake при первоначальном развёртывании проектов.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Nuzhny

В том то и дело что некоторый tif-ы библиотека читает, а вот который выложил я нет...

Можно по конкретнее что где нужно подкрутить чтобы подключить libtiff?

Спасибо за рание.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А, вот в чём дело. Запустил под отладчиком: ошибка "Sorry, requested compression method is not configured"

Если более детально, то используется вид сжатия "TIFF-PackBits", который, оказывается, не поддерживается библиотекой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Nuzhny

понятно, ну скажем я самостоятельно конвертну в удобный вид для библиотеки изображение, а как тогда создать IplImage и поместить в него масив данных?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создаёшь через cvCreateImage, копируешь в буфер imageData. Вообще, зависит от того, в каком формате будут данные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Может кому то и пригодиться


__forceinline int GetBit(const BYTE &btByte, const UINT &nBit)

{

	BYTE btMask = 1 << nBit;

	BYTE btR = btMask & btByte;

	if(btR)

		return 1;

	return 0;

}


IplImage* LoadImage(const CString& strPathName)

{

	Bitmap* pBitmap = NULL;

	IplImage* pImage = NULL;


	pBitmap = new Bitmap(strPathName);

	if(!pBitmap)

		return NULL;

	if(pBitmap->GetLastStatus() != Ok)

	{

		delete pBitmap;

		return NULL;

	}

	if(pBitmap->GetPixelFormat() != PixelFormat1bppIndexed)

	{

		delete pBitmap;

		CStringA strPathNameA(strPathName);

		pImage = cvLoadImage(strPathNameA);

		return pImage;

	}


	BitmapData *pSrcData = new BitmapData;

	SecureZeroMemory(pSrcData, sizeof(BitmapData));

	if(pBitmap->LockBits(&Rect(0,0, pBitmap->GetWidth(), pBitmap->GetHeight()), ImageLockModeRead , pBitmap->GetPixelFormat(), pSrcData) != Ok)

	{

		delete pBitmap;

		delete pSrcData;

		return NULL;

	}


	pImage = cvCreateImage(cvSize(pSrcData->Width, pSrcData->Height), IPL_DEPTH_8U, 1);

	if(!pImage)

	{

		delete pBitmap;

		delete pSrcData;

		return NULL;

	}


	int nSize = 0;

	int nStride = abs(pSrcData->Stride);


	BYTE* pSrcPixels = (BYTE*)pSrcData->Scan0;



	for (UINT nY = 0; nY < pSrcData->Height; nY++)

	{

		int nOffset = 0;

		for (int nX = 0; nX < nStride; nX++)

		{				

			BYTE bt8Bit = pSrcPixels[nX + nY * nStride];

			for (int nBit = 7; nBit > -1; nBit--)

			{

				nSize = nX + nY * pImage->widthStep + nOffset;

				if(nSize > pImage->imageSize)

					break;

				int nBW = 0;

				if(GetBit(bt8Bit, nBit))

					nBW = 255;								

				pImage->imageData[nSize] = nBW;


				nOffset++;

			}

			nOffset--;

		}

	}

	delete pBitmap;

	delete pSrcData;

	return pImage;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×