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

Проблема с некоторыми функциями opencv

Recommended Posts

Доброго времени суток.

Намедни столкнулся с проблемой, сделавшей невозможным моё продвижение в работе. Работаю в С++(Visual Studio 2005), OpenCV 2.0. При использовании некоторых функций opencv (таких как cvSobel, cvHarris, cvPreCornerDetect и т.д.) выскакивает подобная ошибка http://i011.radikal.ru/1208/ff/4185b8e858f9.png Попробовав разобраться, обнаружил что ошибка происходит в строке "CV_Assert( src.size() == dst.size() && dst.type() == CV_32FC1 );" и связана с невыполнением второго условия в скобках.

Вырезка из кода:

IplImage *img = 0;

char file1[256];

sprintf( file1, "IMG_7147.jpg");

img = cvLoadImage(file1, CV_LOAD_IMAGE_GRAYSCALE);

IplImage* img2 = cvCreateImage( cvGetSize(img), 8, 1 );

cvLaplace(img, img2, 3);

В данном случае ошибка вылезает вообще дважды. Одна и та же. Но самое интересное, что при нажатии на Continue, некоторые функции в конечном итоге отрабатывают адекватно и выводится результат их работы с помощью cvShowImage, другие же не выводят в конце ничего, кроме серого экрана. Надеюсь мне смогут здесь помочь.

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


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

посмотреть в дебагере загружаются ли изображения(если всё ок то должен быть указан размер)

проверить соответствие типов изображений.

cvCreateImage( cvGetSize(img), 8, 1 );

вообще смущает эта строчка, возможно должно быть 8U1 вместо 8, да и вообще лучше заменить img->depth (если только функция на выход не хочет что то типа float)

типы определены в файле можно посмотреть.

#define CV_8U 0

#define CV_8S 1

#define CV_16U 2

#define CV_16S 3

#define CV_32S 4

#define CV_32F 5

#define CV_64F 6

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


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

Изображения загружаются, размеры тоже в порядке. Замена строки вызвавшей смущение на "IplImage* img2 = cvCreateImage( cvGetSize(img), img->depth, 1 );" ничего не изменило.

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


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

Изображения загружаются, размеры тоже в порядке. Замена строки вызвавшей смущение на "IplImage* img2 = cvCreateImage( cvGetSize(img), img->depth, 1 );" ничего не изменило.

Нужно так:

IplImage* img2 = cvCreateImage( cvGetSize(img), CV_32F, 1 );

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


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

Переходите на C++, легче будет :)

Mat img=imread("filename",0);
Mat img.ConvertTo(img,CV_32FC1,1.0/255);
Mat Result(img.rows,img.cols,CV_32FC1);
// дальше лаплас и все что угодно
....[/code]

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


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

ArtemBogatov

Только больше ошибок вылезло.

Smorodov

Цитата из моего первого сообщения "Работаю в С++(Visual Studio 2005)", так что не в тему ваше "Переходите на C++"

Далее вопрос, что нужно в include писать чтобы тип Mat работал?

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


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

Ну может и не в тему, но:

есть C интерфейс,а есть С++ интерфейс.

"Работаю в С++ (IDE)" совсем не значит что "пишу на С++".

В C++ интерфейсе используются классы, пространства имен, и т.д. а в С этого нет, вывод в консоль при помощи <<, а в С printf, и т.д.

причем мешать между собой стили это дурной тон (правда сам этим грешу :) ).

Оба они нормально перевариваются С++ компилятором, так как C++ включает в себя большинство конструкций C.

И opencv имеет функции обоих стандартов, С - работают с IplImage* и имеют префикс Cv

и С++ находится в пространcтве имен cv и работает с классом Mat.

Так что уж извините :)

Чтобы работал Mat нужно установить версию opencv 2.x, желательно 2.4 и в программе вписать заголовочники (не все нужны но для комплекта привожу все, стереть всегда проще чем вписывать):


#include "opencv2/core/gpumat.hpp"
#include "opencv2/core/opengl_interop.hpp"
#include "opencv2/gpu/gpu.hpp"
#include "opencv2/ml/ml.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/legacy/legacy.hpp"
using namespace std;// это по желанию
using namespace cv;
[/code]

ЗЫ: при использовании Mat, координаты меняются местами.

С++

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


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

Я всё это прекрасно зна. На "дурной тон" честно говоря всё равно, тем более что программа не корпоративная, а всего лишь частный заказ частного лица. Да и скажем мой бывший научный руководитель - нынешний работодатель приучил к такому способу, поскольку до него я с opencv не сталкивался. opencv стоит 2.0, как я уже писал, но как я понимаю по отсутствующему у себя gpumat необходимо всё же поставить более новую версию. Жаль. Хотелось бы обойтись без таких радикальных мер. ЧТо ж, попробую - отпишусь.

И да, мне не надо приводить ссылки на С++ в викиучебнике. Уж не знаю для чего это было сделано, но именно С++ я изучал 5 лет и что это такое уж знаю, поверьте.

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


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

Установка новой версии себя оправдает, в ней много чего улучшили, 2.0, 2.1 одни из самых медленных и глючных, плюс в новых версиях код легко, с очень незначительными изменениями, переводится на GPU.

ЗЫ:больше 15 лет программирую, больше 5 преподаю в политехе, и все еще пользуюсь справочниками и учебниками, и не считаю это чем-то неприличным.

И если посоветуете хорошие книги, или справочники буду только благодарен.

Частенько пользуюсь сайтом http://www.cplusplus.com/reference/ например.

Такие вот дела :)

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


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

ArtemBogatov

Только больше ошибок вылезло.

Посмотрите здесь: http://robocraft.ru/blog/computervision/460.html . Последний пример ─ то, что Вам нужно. Если OpenCV опять начнёт сопротивляться, приведите текст ошибок ─ попробую помочь.

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×