IPB

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Основные вопросы для C++Builder6+OpenCV, от азов и поэтапно
koroplysov
post 5.12.2009, 21:08
Post #1


Новичок
*

Группа: Пользователи
Сообщений: 2

Регистрация: 21.11.2009
Пользователь №: 528



Репутация:   0  


Пока использую OpenCV_1.1pre1a.exe
Вопросы такие:
1. как скомпилировать нормально приложение, чтоб не просило лишнего. если установить опции компиляции в билдере для работы без установленного билдера, то требует неизвестную библиотеку VIDEOINPUT.DLL
2. если скомпилировать как указанотут, то приложение (перенес как понял из примеров facedetect.c) после закрытия не выгружается из памяти, в диспетчере задач видно. хотя если на кнопку нажать и отменить выбор картинки, то тоже не выгружается, хотя ни одна функция опенцв не успевает выполниться. пример тут (только без длл)Attached File  пример.rar ( 88,73 килобайт ) Number of downloads: 10

это код примера. функция detect_and_draw не изменялась.
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"

#include "cv.h"
#include "highgui.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <float.h>
#include <limits.h>
#include <time.h>
#include <ctype.h>

#ifdef _EiC
#define WIN32
#endif

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

static CvMemStorage* storage = 0;
static CvHaarClassifierCascade* cascade = 0;
static CvHaarClassifierCascade* nested_cascade = 0;
double scale = 1;

void detect_and_draw( IplImage* img )
{
    static CvScalar colors[] =
    {
        {{0,0,255}},
        {{0,128,255}},
        {{0,255,255}},
        {{0,255,0}},
        {{255,128,0}},
        {{255,255,0}},
        {{255,0,0}},
        {{255,0,255}}
    };

    IplImage *gray, *small_img;
    int i, j;

    gray = cvCreateImage( cvSize(img->width,img->height), 8, 1 );
    small_img = cvCreateImage( cvSize( cvRound (img->width/scale),
                         cvRound (img->height/scale)), 8, 1 );

    cvCvtColor( img, gray, CV_BGR2GRAY );
    cvResize( gray, small_img, CV_INTER_LINEAR );
    cvEqualizeHist( small_img, small_img );
    cvClearMemStorage( storage );

    if( cascade )
    {
        double t = (double)cvGetTickCount();
        CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,
                                            1.1, 2, 0
                                            //|CV_HAAR_FIND_BIGGEST_OBJECT
                                            //|CV_HAAR_DO_ROUGH_SEARCH
                                            |CV_HAAR_DO_CANNY_PRUNING
                                            //|CV_HAAR_SCALE_IMAGE
                                            ,
                                            cvSize(30, 30) );
        t = (double)cvGetTickCount() - t;
        printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );
        for( i = 0; i < (faces ? faces->total : 0); i++ )
        {
            CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
            CvMat small_img_roi;
            CvSeq* nested_objects;
            CvPoint center;
            CvScalar color = colors[i%8];
            int radius;
            center.x = cvRound((r->x + r->width*0.5)*scale);
            center.y = cvRound((r->y + r->height*0.5)*scale);
            radius = cvRound((r->width + r->height)*0.25*scale);
            cvCircle( img, center, radius, color, 3, 8, 0 );
            if( !nested_cascade )
                continue;
            cvGetSubRect( small_img, &small_img_roi, *r );
            nested_objects = cvHaarDetectObjects( &small_img_roi, nested_cascade, storage,
                                        1.1, 2, 0
                                        //|CV_HAAR_FIND_BIGGEST_OBJECT
                                        //|CV_HAAR_DO_ROUGH_SEARCH
                                        //|CV_HAAR_DO_CANNY_PRUNING
                                        //|CV_HAAR_SCALE_IMAGE
                                        ,
                                        cvSize(0, 0) );
            for( j = 0; j < (nested_objects ? nested_objects->total : 0); j++ )
            {
                CvRect* nr = (CvRect*)cvGetSeqElem( nested_objects, j );
                center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);
                center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);
                radius = cvRound((nr->width + nr->height)*0.25*scale);
                cvCircle( img, center, radius, color, 3, 8, 0 );
            }
        }
    }

    cvShowImage( "result", img );
    cvReleaseImage( &gray );
    cvReleaseImage( &small_img );
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        if(OpenDialog1->Execute())
        {
                AnsiString s=Application->ExeName;
                s=s.SubString(1,s.LastDelimiter("\\"))+"haarcascade_frontalface_alt.xml";
                IplImage *image = 0;
                cascade = (CvHaarClassifierCascade*)cvLoad( s.c_str(), 0, 0, 0 );
                storage = cvCreateMemStorage(0);
                image = cvLoadImage( OpenDialog1->FileName.c_str(), 1 );
                cvNamedWindow( "result", 1 );
                detect_and_draw( image );
                cvWaitKey(0);
                cvReleaseImage( &image );
                cvDestroyWindow("result");
        }
}
//---------------------------------------------------------------------------

3. можно ли добавить в проект на билдере *.CPP или скомпилировать библиотеки в билдере, а то после конвертации либов в них остаются только ссылки на длл.

Спасибо за советы.
Перейти в начало страницы
 
+Цитировать сообщение
Smorodov
post 6.12.2009, 15:09
Post #2


Администратор
***

Группа: Главные администраторы
Сообщений: 507

Регистрация: 29.4.2009
Пользователь №: 1



Репутация:   7  


У меня все чисто выгружается (конкретно этот пример).
Система виста.


--------------------
Перейти в начало страницы
 
+Цитировать сообщение
maksimka
post 8.12.2009, 15:04
Post #3


Новичок
*

Группа: Пользователи
Сообщений: 4

Регистрация: 29.11.2009
Пользователь №: 541



Репутация:   0  


У меня тоже в памяти остается (про пример).
OpenCV начал изучать буквально на днях, но такая же проблема уже встречалась. Пока предполагаю что что-то не то с функцией cvLoadImage,
т.к. когда делаю через нее - глюк присутствует, без - все ОК.
Т.к. у меня результаты всех действий выводятся на экран в виде битмапа, и вообще все что происходит с TBitmap копируется сразу в IplImage, и наоборот, то пока решил проблему так:
bitmap_img -> LoadFromFile(g_filename);
cv_img = TBitmapToIplImage(bitmap_img);

если делать
bitmap_img -> LoadFromFile(g_filename);
cv_img = cvLoadImage(bitmap_img.c_str());
сразу глючит.

Система: ХР.
Перейти в начало страницы
 
+Цитировать сообщение
youzhick
post 21.1.2010, 17:50
Post #4


Новичок
*

Группа: Пользователи
Сообщений: 2

Регистрация: 21.1.2010
Пользователь №: 674



Репутация:   0  


Тоже не выгружаются многие аппликухи, использующие OpenCV.
Причем, есть два компьютера (оба Win XP): на одном все корректно завершается, на другом - остаются "призраки". Не выгружается на втором даже большинство OpenCVшных самплов.

За прошедшее с последнего сообщения время никто проблему так и не решил?
Перейти в начало страницы
 
+Цитировать сообщение
Smorodov
post 21.1.2010, 21:30
Post #5


Администратор
***

Группа: Главные администраторы
Сообщений: 507

Регистрация: 29.4.2009
Пользователь №: 1



Репутация:   7  


Цитата(youzhick @ 21.1.2010, 18:50) *
Тоже не выгружаются многие аппликухи, использующие OpenCV.
Причем, есть два компьютера (оба Win XP): на одном все корректно завершается, на другом - остаются "призраки". Не выгружается на втором даже большинство OpenCVшных самплов.

За прошедшее с последнего сообщения время никто проблему так и не решил?


Сталкивался с таким поведением, когда камера не останавливала свою работу корректно.
При этом: не запускались другие приложения, лампочка на камере светилась, процессы застревали в памяти, помогала только холодная перезагрузка.
Отсюда предложение, может перед завершением приложения надо подождать отключения камеры?


--------------------
Перейти в начало страницы
 
+Цитировать сообщение
youzhick
post 25.1.2010, 18:46
Post #6


Новичок
*

Группа: Пользователи
Сообщений: 2

Регистрация: 21.1.2010
Пользователь №: 674



Репутация:   0  


Цитата(Smorodov @ 21.1.2010, 21:30) *
Сталкивался с таким поведением, когда камера не останавливала свою работу корректно.
При этом: не запускались другие приложения, лампочка на камере светилась, процессы застревали в памяти, помогала только холодная перезагрузка.
Отсюда предложение, может перед завершением приложения надо подождать отключения камеры?

Не, такая фигня происходит с совершенно разными Open CV приложениями (родными примерами), в т.ч. и не использкющими камеру.
А в своей собственной программе я получаю такую же проблему даже просто добавив инклуды OCVшных хедеров. Вообще не вызывая из них ничего.
Причем, до закрытия программа функционирует совершенно нормально, и после попытки закрытия "подвисший призрак" ничуть не мешает запуску и работе других аппликух - в т.ч. и запуску других копий этой же. Что с камерой - что без. Никаких явных сбоев, кроме того, что остается лишний процесс, жрущий ~10 метров памяти.

И это только на одном компе, на другом - все ОК. Вот только запустить в результате надо на том, на котором не ОК smile.gif
Перейти в начало страницы
 
+Цитировать сообщение
Smorodov
post 26.1.2010, 18:13
Post #7


Администратор
***

Группа: Главные администраторы
Сообщений: 507

Регистрация: 29.4.2009
Пользователь №: 1



Репутация:   7  


Цитата(youzhick @ 25.1.2010, 19:46) *
Не, такая фигня происходит с совершенно разными Open CV приложениями (родными примерами), в т.ч. и не использкющими камеру.
А в своей собственной программе я получаю такую же проблему даже просто добавив инклуды OCVшных хедеров. Вообще не вызывая из них ничего.
Причем, до закрытия программа функционирует совершенно нормально, и после попытки закрытия "подвисший призрак" ничуть не мешает запуску и работе других аппликух - в т.ч. и запуску других копий этой же. Что с камерой - что без. Никаких явных сбоев, кроме того, что остается лишний процесс, жрущий ~10 метров памяти.

И это только на одном компе, на другом - все ОК. Вот только запустить в результате надо на том, на котором не ОК smile.gif


А если ему дать задание на самоубийство: после завершения послать процессу WM_CLOSE, если не поможет то через TerminateProcess.
Мне не проверить предположение, у меня все очищается и так.
И еще, какие точно версии WindowsXP стоят на одном (где все очищается) и на другом (на котором нет)?
Можно ли убить призрак через диспетчер задач?


--------------------
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members:

 



RSS Текстовая версия Сейчас: 8.9.2010, 23:34
Design by: Invision Skins & Anonymous Proxy