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

Предобработчик изображений для начинающих

Recommended Posts

Мне кажется многим начинающим данная тема очень может пригодится.

Дело вот в чем: В университете написал прогу у которой с одной стороны загружается изображение, а с другой стороны множество кнопочек, на каждую кнопочку завязана определенная часто используемая функция, например cvErode, cvDilate, cvCanny, cvNormalize и т.д. такой подход помогает разобраться что и как работает и главное находить комбинации алгоритмов позволяющие наиболее эффективно решать определенную задачу обработки. К сожалению прога утеряна.

Самому долго собирать, а вещь зачастую очень полезная - посмотреть иногда что и как работает на конкретном изображении.

Кто-нибудь подобным занимался?

Есть ли исходник позволяющий производить нечто подобное, какой-нибудь OpenCVшный предобработчик изображений готовый?

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

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


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

что то типа этого ?

http://sourceforge.net/projects/s2ilib/

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


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

что то типа этого ?

http://sourceforge.net/projects/s2ilib/

Слишком как-то наворочено, попроще бы.

Что-нибудь самодельное, простенький интерфейс и штук десять кнопок с основными функциями.

Чем проще тем лучше. Неужели ни у кого нет?

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


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

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

Вот еще один проект:

http://www.xdp.it/cximage/

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


Ссылка на сообщение
Поделиться на других сайтах
Думаю что нет, тот кто может это написать, для прототипирования наверняка использует питон или матлаб.

можно использовать еще FIJI (ImageJ) там много всего есть и можно быстро посмотреть результат.

а еще есть довольно простая штука http://www.aforgenet.com/projects/iplab/downloads.html

http://code.google.com/p/iplab/

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


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

Вообщем соорудил я интерфейс в QT (в прикрепленном файле) и все функции подготовил.

Теперь просьба к разбирающимся в стыковке изображений QT + OpenCV: пожалуйста помогите ОpenCVшный формат изображения загружаемый через Mat или IplImage, кому как удобнее, подружить с QTшным Frame или TextLabel (чтобы картинка загружалась). Бьюсь с этим делом но ничего не выходит :(

ResearchAlg.rar

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


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

а вы OpenCV собирали с поддержкой Qt или сами ваяли?

У меня интеграция QT в VS 2008.

Интерфейс соорудил самостоятельно с помощью QT Designer, так как люблю растаскивать элементы GUI самостоятельно, а не по координатам или вообще автоматом куда системе удобнее.

Каркас рабочий, то есть открываете солюшен-файл и если у вас установлена интеграция QT в Visual Studio (как у меня) проблем не будет, компилируете и любуетесь интерфейсом (в архивчике что я скинул, в папке debug можно запустить .ехе полюбоваться пока без функционала).

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


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

Я так понял вы хотите отображать cv:Mat в виджет?

1) создаете свой виджет

2) меняете у него paintEvent, и через QPainter рисуете картинку

3) чтобы отрисовывать картинку переведите cv::Mat в QImage

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


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

Примерно так и делаю.

Вот этот код Smorodov написал в одном из веток форума (у меня не фурычит):


///////////////////////////////////////////Пример №1 через cv::Mat///////////////////////////////////////////////////

void Research::LoadImage()

{

	QString fileName = QFileDialog::getOpenFileName(this, QString::fromWCharArray(L"Открыть файл"));

	QString fileName = QFileDialog::getOpenFileName(this);

     if (!fileName.isEmpty())

         loadFile(fileName);

        if (fileName != "") 

        {

                Mat img=imread(fileName.toStdString(),1);

                QImage i=Mat2QImage((Mat3b)img);

                QPixmap pm = QPixmap::fromImage(i);

                ui.ImageFrame->setScaledContents(true);

                ui.ImageFrame->setPixmap(pm);


}


QImage Mat2QImage(const cv::Mat3b &src) 

{

        QImage dest(src.cols, src.rows, QImage::Format_ARGB32);

        for (int y = 0; y < src.rows; ++y) 

        {

                const cv::Vec3b *srcrow = src[y];

                QRgb *destrow = (QRgb*)dest.scanLine(y);

                for (int x = 0; x < src.cols; ++x) 

                {

                        destrow[x] = qRgba(srcrow[x][2], srcrow[x][1], srcrow[x][0], 255);

                }

        }

        return dest;

}


QImage Mat2QImage(const cv::Mat_<double> &src)

{

        double scale = 255.0;

        QImage dest(src.cols, src.rows, QImage::Format_ARGB32);

        for (int y = 0; y < src.rows; ++y) 

        {

                const double *srcrow = src[y];

                QRgb *destrow = (QRgb*)dest.scanLine(y);

                for (int x = 0; x < src.cols; ++x) 

                {

                        unsigned int color = srcrow[x] * scale;

                        destrow[x] = qRgba(color, color, color, 255);

                }

        }

        return dest;

}


////////////////////////////////////////////////////////////////////////////////////////////////////



///////////////////////////////////////////////Пример №2 через IplImage/////////////////////////////

void Research::LoadImage(IplImage *cvimage) 

{

int cvIndex, cvLineStart;

     switch (cvimage->depth) {

        case IPL_DEPTH_8U:

            switch (cvimage->nChannels) {

                case 3:

                    if ( (cvimage->width != image.width()) || (cvimage->height != image.height()) ) {

                        QImage temp(cvimage->width, cvimage->height, QImage::Format_RGB32);

                        image = temp;

                    }

                    cvIndex = 0; cvLineStart = 0;

                    for (int y = 0; y < cvimage->height; y++) {

                        unsigned char red,green,blue;

                        cvIndex = cvLineStart;

                        for (int x = 0; x < cvimage->width; x++) {

                            // DO it

                            red = cvimage->imageData[cvIndex+2];

                            green = cvimage->imageData[cvIndex+1];

                            blue = cvimage->imageData[cvIndex+0];


                            image.setPixel(x,y,qRgb(red, green, blue));

                            cvIndex += 3;

                        }

                        cvLineStart += cvimage->widthStep;                        

                    }

                    break;

                default:

                    printf("This number of channels is not supported\n");

                    break;

            }

            break;

        default:

            printf("This type of IplImage is not implemented in QOpenCVWidget\n");

            break;

    }

	ui.ImageFrame->setPixmap(QPixmap::fromImage(image));    

}

Пример №2 нашел на одном из многочисленных забугорных форумов посвященной этой теме. Некоторые пишут работает, у других этот же код не фурычит.

P.S.: Причем прикрутить видеопоток с камеры через OpenCV в QT у меня без проблем получается, пару строчек кода, а вот с отдельной картинкой получается что не получается.

Оба примера не фурычат и у меня. Может библиотек каких не хватает, а может руки не от туда растут :)

Вообщем c QT если кто знаком, будьте добры закиньте код из этого сообщения в каркасный проект выложенный мной выше и проверьте на работоспособность.

Хотелось бы с этой темой раз и навсегда покончить.

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


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

я с QT не работал, но предполагаю, что если собрать opencv с поддержкой qt, то там будут для этого функции, да и примеры должны быть скорее всего в samples.

попробовал кстати враппер opencv под C#, там вроде всё удобно.

позже может выложу проект.

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


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

PaintEvent добавьте такого вида, где outputImage - изображение которое необходимо отображать

void paint::paintEvent(QPaintEvent *)

{

QRectF target(0.0, 0.0, outputImage.width(), outputImage.height());

QRectF source(0.0, 0.0, outputImage.width(), outputImage.height());

QPainter painter(this);

painter.drawImage(target, outputImage, source);

}

//------------------------------------------------------------

как перевести в QImage Вы знаете

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


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

Вот, открывает файлы изображений и выводит на форму

SimpleQTApp.rar

post-1-0-54376500-1351620519_thumb.jpg

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


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

Целая куча ошибок такого плана:

1>simpleqtapp.obj : error LNK2001: неразрешенный внешний символ ""public: virtual class cv::Mat & __thiscall cv::_OutputArray::getMatRef(int)const " (?getMatRef@_OutputArray@cv@@UBEAAVMat@2@H@Z)"

1>simpleqtapp.obj : error LNK2001: неразрешенный внешний символ ""public: virtual void __thiscall cv::_OutputArray::create(int,int const *,int,int,bool,int)const " (?create@_OutputArray@cv@@UBEXHPBHHH_NH@Z)"

1>simpleqtapp.obj : error LNK2001: неразрешенный внешний символ ""public: virtual void __thiscall cv::_OutputArray::create(int,int,int,int,bool,int)const " (?create@_OutputArray@cv@@UBEXHHHH_NH@Z)"

1>simpleqtapp.obj : error LNK2001: неразрешенный внешний символ ""public: virtual void __thiscall cv::_OutputArray::create(class cv::Size_<int>,int,int,bool,int)const " (?create@_OutputArray@cv@@UBEXV?$Size_@H@2@HH_NH@Z)"

1>simpleqtapp.obj : error LNK2001: неразрешенный внешний символ ""public: virtual void __thiscall cv::_OutputArray::release(void)const " (?release@_OutputArray@cv@@UBEXXZ)"

1>simpleqtapp.obj : error LNK2001: неразрешенный внешний символ ""public: virtual void __thiscall cv::_OutputArray::clear(void)const " (?clear@_OutputArray@cv@@UBEXXZ)"

Походу накрылась моя студия, настройки проекта не держит.

Спасибо всем, буду разбираться.

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


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

OpenCV должна быть собрана с включенной опцией поддержки Qt, когда я пробовал собирать со стандартной сборкой, у меня были очень похожие ошибки.

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


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

OpenCV должна быть собрана с включенной опцией поддержки Qt, когда я пробовал собирать со стандартной сборкой, у меня были очень похожие ошибки.

в последних версиях это не обязательно. Достаточно правильно прописать пути к файлам библиотеки.

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


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

всё таки думаю что есть смысл делать на основе

http://code.google.com/p/opencvsharp/

единственная проблема которую вижу, это то что возможно они не все новые функции обёртывают сразу же.

и еще некоторые коменты на японском.

а так очень удобно

http://code.google.com/p/opencvsharp/downloads/list

OpenCvSharp-2.4-x86-20121010.zip OpenCvSharp Binary for OpenCV2.4 32-bit Featured Oct 10 Oct 10 930 KB 1286

Sample-2.4-20121007.zip OpenCvSharp Samples for OpenCV2.4 Featured Oct 6 Oct 6 21.9 MB 873

сборки вроде свежайшие.

только непонятно сэмплы не стали запускаться без OpenCvSharp длл, я кинул их в папку и там многие совпали, ну я заменил(вроде как более новыми), но в каком то тесте на GPU все таки выдало одну ошибку при компиляции что то не нашло.

а так если учитывать, что на форму можно выводить одной стрчокой, то очень удобно, всё готово к работе.

еще тут вопрос есть как лучше рисовать примитивы прямо на растре или через Graphics.drawline() и т.д.?

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×