Понеділок, 18.02.2019, 09:29
Гость

Мішатронік

Автор - Кренцін Михайло

Мобільна версія | Додати у вибране  | Мій профіль | Вихід | RSS |
Меню сайту
Категории раздела
Наше опитування
Чи працювали ви з мікроконтролером?
Всього відповідей: 4
Статистика

Онлайн всього: 1
Гостей: 1
Користувачів: 0




Главная » FAQ


// для получения текущей даты и  времени воспользуйтесь функцией

// Now() из модуля Sysutils.hpp . Отобразить  полученные дату и

// время можно следующим образом (Button1 - кнопка на  форме):

void __fastcall TForm1::Button1Click(TObject  *Sender)

{

Form1->Caption =  DateTimeToStr(Now());

}


// для получения текущего времени воспользуйтесь функцией  Time()

// из модуля Sysutils.hpp . Отобразить полученную дату можно

//  следующим образом (Button1 - кнопка на форме):

void __fastcall  TForm1::Button1Click(TObject *Sender)

{

Form1->Caption =  DateTimeToStr(Time());

}


// для получения дня недели воспользуйтесь функцией  DayOfWeek()

// из модуля Sysutils.hpp, передав ей текущую дату.  DayOfWeek

// возвращает значение от 1 до 7, где 1 - воскресенье,

// 2 -  понедельник, и т. д.

int Day =  DayOfWeek(Date());


Напишите следующий код:

void __fastcall  TForm1::Timer1Timer(TObject *Sender)

{

Label1->Caption =  FormatDateTime("hh:nn",Time());

Timer1->Interval=10000;// меньше число, больше точность

}


// Напишите следующий код:

DWORD start=GetTickCount();
// тут ваша функция или как-либо действия

Edit1->Text=FloatToStr((GetTickCount()-start)/1000.);


// Преобразование осуществляется следующей функцией:

void SetBitmapPaletteToGreyScale(Graphics::TBitmap *pBitmap)

{

    LOGPALETTE *pal;

    HPALETTE hpal;

    int i;

    int PaletteSize; //Size of the palette buffer

    pBitmap->PixelFormat = pf8bit;

    pal = NULL;

    PaletteSize = sizeof(TLogPalette) + (sizeof(TPaletteEntry) * 255);

    pal = (LOGPALETTE *) malloc(PaletteSize);

    pal->palVersion = 0x300;

    pal->palNumEntries = 256;

    for (i = 0 ; i <= 255; i++)

    {

      pal->palPalEntry[i].peRed = i;

      pal->palPalEntry[i].peGreen = i;

      pal->palPalEntry[i].peBlue = i;

      pal->palPalEntry[i].peFlags = PC_NOCOLLAPSE;

    }

    hpal = CreatePalette(pal);

    if(hpal != 0) pBitmap->Palette = hpal;

    free(pal);

}


// Для того чтобы проиграть MIDI:

#include



mciSendString("open anny.mid type sequencer alias MUSIC", NULL, 0, 0);

mciSendString("play MUSIC from 0", NULL, 0, 0);


// Для того чтобы воспроизвести  звуковой файл:

// напишите следующий код

#include  "mmsystem.h"

DWORD fdwSound = SND_ASYNC |  SND_FILENAME;

PlaySound("C:\\click.wav",NULL, fdwSound);


// напишите следующий код

BMP.Monochrome = true ; //где BMP - TBitmap


// Для определения размера диска используйте функцию DiskSize,  объявленную в Sysutils.hpp. В параметрах функции диску А соответствует 1, диску  В - 2, и т. д., 0 - текущий диск. Следующий код определит размер диска С в  байтах.

__int64 Size = DiskSize(3);


// Для определения свободного  пространства на диске используйте функцию DiskFree, объявленную в Sysutils.hpp.  В параметрах функции диску А соответствует 1, диску В - 2, и т. д., 0 - текущий  диск. Следующий код определит размер свободного пространства на диске С в  байтах.

__int64 FreeSpace = DiskFree(3);


// для  использования функции необходимо подключить файл

// shlobj.h

//  lpszPathObj - путь к объекту, для которого будет

// создаваться ярлык

//  lpszPathLink - где будет создаватья ярлык

// lpszDesc - описание  ярлыка

HRESULT CreateLink(LPCSTR lpszPathObj, LPSTR  lpszPathLink, LPSTR lpszDesc)

{

    HRESULT hres;

    IShellLink  *psl;

    CoInitialize(NULL);

    hres =  CoCreateInstance(CLSID_ShellLink, NULL,

    CLSCTX_INPROC_SERVER,  IID_IShellLink, (void  **)&psl);

    if(SUCCEEDED(hres))

    {

        IPersistFile  *ppf;

        psl->SetPath(lpszPathObj);

        psl->SetDescription(lpszDesc);

        hres  = psl->QueryInterface(IID_IPersistFile,  (void**)&ppf);

        if(SUCCEEDED(hres))

        {

            wchar_t  wsz[MAX_PATH];

            MultiByteToWideChar(CP_ACP, 0, lpszPathLink, -1, wsz,  MAX_PATH);

            hres = ppf->Save(wsz,  true);

            ppf->Release();

        }

        psl->Release();

        CoUninitialize();

    }

    return  hres;

}


// Для удаления файла надо подключить к проекту Sysutils.hpp и напишите следующий код:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

    AnsiString FileName="c:\\readme.txt";

    if (DeleteFile(FileName)) Label1->Caption="true";

}


// На форме разместите TOpenDialog (OpenDialog1) и TButton

// (Button1) напишите следующий обработчик события OnClick кнопки:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

    if(OpenDialog1->Execute())

    {

        SHELLEXECUTEINFO SEI;

        ZeroMemory(&SEI, sizeof(SHELLEXECUTEINFO));

        SEI.cbSize= sizeof(SHELLEXECUTEINFO);

        SEI.lpVerb = "properties";

        SEI.lpFile= OpenDialog1->FileName.c_str();

        SEI.nShow = SW_SHOW;

        SEI.fMask= SEE_MASK_INVOKEIDLIST;

        ShellExecuteEx(&SEI);

    }

}


// Для  того чтобы скопировать файлы напишите следующий код:

int  MoveFiles( AnsiString slSourceDir, AnsiString slTargetDir, bool toCopy = true  )

{

    SHFILEOPSTRUCT sh;

    sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT |  FOF_FILESONLY;

    sh.wFunc = toCopy ? FO_COPY : FO_MOVE;

    sh.pFrom =  slSourceDir.c_str();

    sh.pTo = slTargetDir.c_str();

    sh.hNameMappings =  NULL;

    sh.lpszProgressTitle = NULL;

    return SHFileOperation ( &sh  );

}



void __fastcall TForm1::Button1Click(TObject  *Sender)

{

    //copy all from program  files

    if(!MoveFiles("c:\\program files\\*.*",  "c:\\temp"))

    ShowMessage("Ok");

    else  ShowMessage("No");

}

// В функции MoveFiles первый  параметр что копировать,

// второй куда копировать


// Для удаления директории напишите следующий код:

void __fastcall TForm1::Button1Click(TObject *Sender)

{

    SHFILEOPSTRUCT sh;

    sh.hwnd=Form1->Handle;

    sh.wFunc = FO_DELETE;

    sh.pFrom = "c:\\test\0"; //удаляемая директория

    sh.pTo = NULL;

    sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;

    sh.hNameMappings = 0;

    sh.lpszProgressTitle = NULL;

    SHFileOperation(&sh);

}


// На  форме должны быть Lаbel1 и Button1, затем напишите следующий  код:

TDateTime FileTimeToDateTime(FILETIME *lpftime)

{

    FILETIME  localfiletime;

    SYSTEMTIME  systime;

    FileTimeToLocalFileTime(lpftime,&localfiletime);

    FileTimeToSystemTime(&localfiletime,&systime);

    return(TDateTime(systime.wYear,  systime.wMonth, systime.wDay)+

    TDateTime(systime.wHour,  systime.wMinute,

    systime.wSecond, systime.wMilliseconds));

    }

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

    void  __fastcall TForm1::Button1Click(TObject *Sender)

    {

    FILETIME  ftCreationTime,ftLastAccessTime,ftLastWriteTime;

    HANDLE  hFile=(HANDLE)FileOpen("c:\\autoexec.bat",fmOpenRead);

GetFileTime(hFile,&ftCreationTime,&ftLastAccessTime,&ftLastWriteTime);
    AnsiString  FileInfo="FileName: c:\\autoexec.bat";

    FileInfo+="\nCreation  Time:"+

    FormatDateTime("c",FileTimeToDateTime(&ftCreationTime));

    FileInfo+="\nLast  Access  Time:"+

    FormatDateTime("c",FileTimeToDateTime(&ftLastAccessTime));

    FileInfo+="\nLast  Write  Time:"+

    FormatDateTime("c",FileTimeToDateTime(&ftLastWriteTime));

    Label1->Caption=FileInfo;

    FileClose((int)  hFile);

}


// Для поиска файлов в каталоге и его подкаталогах напишите  следующий код:

void ListFiles(AnsiString path, TStrings*  List)

{

// Эта процедура выводит список файлов и  вызывает

// саму себя для всех  каталогов

TSearchRec sr;

if (FindFirst(path+"*.*",  faAnyFile, sr) == 0)

{

     do

     {

         if (sr.Attr &  faDirectory)

          {

              if (sr.Name!=".")

              if  (sr.Name!="..")

              {

                  ListFiles(path+sr.Name+"\\",List);// Рекурсивный  вызов

              }

          }

          else

          {

           AnsiString  Ext=ExtractFileExt(sr.Name).UpperCase();

           if  (Ext==".CPP")

           List->Add(path+sr.Name);

          }

     }

     while  (FindNext(sr) ==  0);

     FindClose(sr);

}

    Application->ProcessMessages();

}



void  __fastcall TForm1::Button1Click(TObject  *Sender)

{

    ListFiles("c:\\",Memo1->Lines);

}


// Для того чтобы выбрать папку из диалога напишите следуюший  код:

#include

.. .. .. ..

AnsiString way =  "c:\\";

if(SelectDirectory("Укажите путь к папке","",way)) 

  Label1->Caption = way;


// Для того чтобы удалить папку и все файлы в ней напишите следующую функцию:

bool DeleteDir(AnsiString DirName)

{

TSearchRec sr;

if (DirName.Length())

{

if (!FindFirst(DirName+"\\*.*",faAnyFile,sr))

do

  {

  if (!(sr.Name=="." || sr.Name==".."))// это удалять не надо

   if (((sr.Attr & faDirectory) == faDirectory ) ||

   (sr.Attr == faDirectory))// найдена папка

    {

    FileSetAttr(DirName+"\\"+sr.Name, faDirectory );// сброс всяких read-only

    DeleteDir(DirName+"\\"+sr.Name);//рекурсивно удаляем содержимое

    RemoveDir(DirName + "\\"+sr.Name);// удаляем теперь уже пустую папку

    }

    else// иначе найден файл

    {

    FileSetAttr(DirName+"\\"+sr.Name, 0);// сброс всяких read-only

    DeleteFile(DirName+"\\"+sr.Name);// удаляем файл

    }

  }

while (!FindNext(sr));// ищем опять, пока не найдем все

FindClose(sr);

}

RemoveDir(DirName);

return true;

}


// Напишите следующую  функцию:

#include

TRegistry *Reg;

Reg=NULL;

try

{

  Reg=new TRegistry;

  Reg->RootKey=HKEY_CLASSES_ROOT;

  Reg->OpenKey("\\.ant",true);

  Reg->WriteString("","MyProgram");

  Reg->CloseKey();

Reg->OpenKey("\\MyProgram", true);
Reg->WriteString("","My document");
  Reg->CloseKey();

  Reg->OpenKey("\\MyProgram\\Shell\\Open\\Command",true);

  Reg->WriteString("",ParamStr(0)+" \"%1\"");

  Reg->CloseKey();

  Reg->OpenKey("\\MyProgram\\DefaultIcon",true);

  Reg->WriteString("",ParamStr(0)+", 1");

  Reg->CloseKey();

}

__finally

{

if (Reg!=NULL)delete Reg;

}

// Весь текст генерирует расширение *.ant


// А этот код загружает файл с расширением *.ant в Image1.
if (ParamCount>0)

{

asFileName=ParamStr(1);

if (FileExists(asFileName)) Image1->Picture->LoadFromFile(asFileName);

  else ShowMessage(asFileName+" ОШИБКА ЗАГРУЗКИ ФАЙЛА!!!");

}


из файла, нужно сохранить в другой файл, только подстроки (остаток от строк) после слова: Группа:(Как пример)
 

#include

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    std::auto_ptrL(new TStringList);
    String s = L"Группа:";
    L->LoadFromFile("D:\\test\\0101.txt", TEncoding::GetEncoding(1251));
    for (int i = L->Count - 1; i >= 0; i--)
    {
        WideString t = L->Strings[i];
        if (StartsText(s, t))
            L->Strings[i] = RightStr(t, t.Length() - s.Length()).Trim();
        else
            L->Delete(i);
    }
    L->SaveToFile("D:\\test\\20101.txt");
}


Выводит список подключений к интеренету

#include

#include



#include

#include



#pragma hdrstop

#include

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

#pragma argsused



using namespace std;





int _tmain(int argc, _TCHAR* argv[])

{

system("chcp 1251");



    RASCONN ras[20];

    DWORD dSize,dNumber;

    ras[0].dwSize = sizeof(RASCONN);

    dSize = sizeof( ras );

    if( RasEnumConnections( ras, &dSize, &dNumber ) == 0 )

    {

        cout <<  "Count Ras " <<  dNumber <<  endl;

        for (DWORD x=0; x < dNumber;x++) cout <<  ras[x].szEntryName<<"\t"<    }

system("pause");

return 0;

}

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


void __fastcall TForm1::StringGrid1DrawCell( TObject *Sender, int ACol, int ARow, TRect &Rect, TGridDrawState State )
{
    TStringGrid *grid = static_cast( Sender );
    TCanvas *can = grid->Canvas;

    can->TextOut( Rect.Left + 2, Rect.Top + 2, grid->Cells[ACol][ARow] );
}


DWORD domainIP()
{
    WSADATA wdata;
    struct hostent *remoteHost;
    int result = WSAStartup(MAKEWORD(2,2), &wdata);
    remoteHost = gethostbyname("ya.ru");
    cout << inet_ntoa(*( struct in_addr*)remoteHost->h_addr_list[0]) << endl;
    this->textBox1->Text=gcnew String(inet_ntoa(*( struct in_addr*)remoteHost->h_addr_list[0]));
    return 0;
}

DWORD domainIP()
{
    WSADATA wdata;
    struct hostent *remoteHost;
    int result = WSAStartup(MAKEWORD(2,2), &wdata);
    remoteHost = gethostbyname("ya.ru");
    cout << inet_ntoa(*( struct in_addr*)remoteHost->h_addr_list[0]) << endl;
    this->textBox1->Text=gcnew String(inet_ntoa(*( struct in_addr*)remoteHost->h_addr_list[0]));
    return 0;
}


String str = "Молоко";
String letter = "о";

for( int count=1; count<=str.Length(); count++ ) //// Вариант в лоб
  if( str[count] == letter[1] )                    //
    Memo1->Lines->Add( count );                  ////

int count = 0;                               //// Человеческий
while( count++ < str.Length() )                //
  if( str.IsDelimiter( letter, count ) )       //
    Memo1->Lines->Add( count );              ////

Ще немає відповіді на це питання.

try
        {
         CreateMutex(NULL,true,"Trial");
         int Res = GetLastError();
         if(Res == ERROR_ALREADY_EXISTS)
          {
           if (Application->MessageBox("У вас уже запущена одна копия приложения \n Найдите её в системном трее, возле часов","Update AVG v 1.1",MB_OK +MB_TOPMOST+ MB_ICONWARNING)==IDOK)
           {
            Application->ShowMainForm=false;
            Application->Terminate();
           }
          }
           if(Res == ERROR_INVALID_HANDLE)
          {
           if (Application->MessageBox("Ошибка в имени mutex object","Update AVG v 1.1",MB_OK +MB_TOPMOST+ MB_ICONWARNING)==IDOK)
            {
              Application->Terminate();
            }
           }
 
ИЛИ
 
try
        {
         CreateMutex(NULL,true,"Trial");
         int Res = GetLastError();
         if(Res == ERROR_ALREADY_EXISTS)
          {
           if (Application->MessageBox("У вас уже запущена одна копия приложения \n Найдите её в системном трее, возле часов","Update AVG v 1.1",MB_OK +MB_TOPMOST+ MB_ICONWARNING)==IDOK)
           {
            Application->ShowMainForm=false;
            Application->Terminate();
           }
          }
           if(Res == ERROR_INVALID_HANDLE)
          {
           if (Application->MessageBox("Ошибка в имени mutex object","Update AVG v 1.1",MB_OK +MB_TOPMOST+ MB_ICONWARNING)==IDOK)
            {
              Application->Terminate();
            }
           }
Ще немає відповіді на це питання.

F1Book1.Write("{Filename}",4);

Ще немає відповіді на це питання.

TFileStream *file = new TFileStream("Имя файла",

                                                     fmOpenRead);//для чтения

unsigned int size_file = file->Size;  //размер файла в байтах

delete file;

Ще немає відповіді на це питання.

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    ShellExecute(NULL, _T("open"), _T("http://cyberforum.ru"), NULL, NULL, SW_SHOWNORMAL);
}

Ще немає відповіді на це питання.

TLabel *LabelDelete;
 LabelDelete= (TLabel *)Form1->FindComponent(((TLabel *)Sender)->Name);
delete LabelDelete;
Ще немає відповіді на це питання.

Синтаксис:

net = newff
net = newff(PR,[S1 S2...SNl],{TF1 TF2...TFNl},BTF,BLF,PF)

Описание:

net = newff создает новую сеть с использованием диалогового окна

NEWFF(PR, [S1 S2...SNl], {TF1 TF2...TFNl}, BTF, LF, PF) в качестве входных параметров использует:

  • PR - Rx2 матрица минимальных и максимальных значений строк входной матрицы с размерностью RxQ. Для получения матрицы PR можно использовать функцию minmax;
  • Si – количество нейронов в i – ом слое, N1 – количество слоев;
  • TFi - функция активации i - го слоя, по умолчанию = 'tansig';
  • BTF – обучающая функция обратного распространения, по умолчанию='trainlm';
  • BLF – алгоритм подстройки весов и смещений (обучающий алгоритм), по умолчанию = 'learngdm';
  • PF - функция оценки функционирования сети, по умолчанию = 'mse';

и возвращает однонаправленную сеть, состоящую из N слоев.

В качестве функций активации TFi можно использовать любые дифференцируемые функции активации, например TANSIGLOGSIG, или PURELIN.

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

Следует обратить внимание, что функция TRAINLM используется по умолчанию, поскольку она обеспечивает наиболее быстрое обучение. Но она требует много памяти. Поэтому, если Вы получаете сообщение "out-of-memory error”, необходимо попытаться выполнить одно из следующих действий:

(1) замедлить процедуру обучения TRAINLM, снизив требования к объему оперативной памяти путем установки параметра NET.trainParam.mem_reduc равным 2 или более (см. HELP TRAINLM )

(2) использовать функцию обучения TRAINBFG, которая работает медленнее, но требует меньше памяти, чем TRAINML.

(3) использовать функцию обучения TRAINRP, которая работает медленнее, но требует меньше памяти, чем TRAINBFG.

В качестве обучающей функции BLF можно использовать любые из алгоритмов обратного распространения. Например LEARNGD или LEARNGDM.

В качестве функции оценки функционирования сети могут быть использованы любые дифференцируемые функции, например MSE или MSEREG.

Примеры:

Имеем набор входных значений P и соответствующих им выходных эталонных значений T. Задача - создать сеть для нахождения выходных значений по входным.

P = [0 1 2 3 4 5 6 7 8 9 10];

T = [0 1 2 3 4 3 2 1 2 3 4];

Создаем двухслойную однонаправленную сеть. Диапазон входных значений от 0 до 10, первый слой состоит из 5 нейронов с функциями активации TANSIG, второй слой содержит один нейрон с функцией активации PURELIN. Для обучения используем функцию TRAINLM:

net = newff([0 10],[5 1],{'tansig','purelin'});

Моделируем сеть. Подаем на вход сети входные значения P. Получаем выходные значения Y:

Y = sim(net,P);

Строим график, демонстрирующий отклонения выходных значений Y от целевых значений T для необученной сети:

plot(P,T,P,Y,'o')

Обучаем (тренируем) сеть. Количество эпох тренировки – 50:

net.trainParam.epochs = 50;

net = train(net,P,T);

Снова моделируем (теперь уже обученную сеть):

Y = sim(net,P);

Строим график для обученной сети:

plot(P,T,P,Y,'o')

Алгоритм:

Однонаправленные нейронные сети состоят из Nl слоев, использующих весовую функцию DOTPROD, входную функцию сети NETSUM и выбранную функцию активации. Первый слой получает веса, приходящие с входа. Каждый последующий слой получает веса от предыдущего слоя. Все слои обладают смещениями. Последний слой является выходом сети. Веса и смещения каждого слоя инициализируются функцией INITNW. Адаптация выполняется с помощью функции TRAINS, которая подстраивает веса в соответствии с выбранной обучающей функцией. Тренировка сети выполнена с помощью выбранной функции. Оценка функционирования сети выполняется с помощью выбранной функции оценки.

 


void __fastcall Tvk::Button1Click(TObject Sender)
{
       TStringList *params = new TStringList;
       TStringList *responseres = new TStringList;
       params->Add("email="+Edit1->Text);
       params->Add("pass="+Edit2->Text);
       Memo1->Lines->Text=IdHTTP1->Post("http://login.vk.com/?act=login",params) ;
       if (Pos("logout", responseres->Text)>0)
                ShowMessage("Авторизовались!");
       else
                ShowMessage("Не верные данные!");
}
Ще немає відповіді на це питання.

MEMORYSTATUSEX stats;
stats.dwLength = sizeof(stats);
GlobalMemoryStatusEx(&stats);
__int64 a;
a=stats.dwMemoryLoad;
RichEdit1->Lines->Add(IntToStr(a)+"%");

 

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

Обнаружение лиц на основе цвета

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

Считаем некоторое исходное изображение в рабочее пространство Matlab.

clear;
%Считывание исходного изображения 
L=imread('im.jpg'); 
[N M s]=size(L);
L=double(L)./255;
figure, imshow(L);
title('Исходное изображение');

 

Далее необходимо на изображении лица выбрать пиксели с характерным цветом, определить среднее значение их интенсивности и среднеквадратическое отклонение.

[x,y,z]=impixel;
r=median(z(:,1)); std_r=std(z(:,1)); 
g=median(z(:,2)); std_g=std(z(:,2)); 
b=median(z(:,3)); std_b=std(z(:,3)); 

На основе знаний о значениях интенсивностей пикселей лица и их возможных вариациях проводится сегментация изображения.

%Сегментация на основе анализа цвета.
for i=1:N;
 disp(i);
 for j=1:M;
 if (abs(L(i,j,1)-r)<std_r)&(abs(L(i,j,2)-g)<std_g)&(abs(L(i,j,3)-b)«std_b);
 L1(i,j)=1;
 else
 L1(i,j)=0;
 end;
end;
end;
figure, imshow(L1);title('Исходное изображение после сегментации');

 

Целью сегментации было выделение лица на изображении. Однако, вполне естественно, что на изображении присутствовали и другие объекты, значения интенсивностей пикселей которых совпали с интенсивностью пикселей лица. В результате на сегментированном изображении кроме лица выделились и другие объекты. Теперь на сегментированном изображении предстоит найти изображение нужного объекта, т.е. лица. Критерии поиска могут быть разными. Это может быть площадь, форма и др. В данном примере в качестве критерия для поиска лица выберем площадь. Исходя из выбранного ранее способа сегментации, можно предположить, что лицо занимает наибольшую площадь. Поэтому выбор критерия для поиска лица на основе площади позволит удалить другие объекты, которые меньше за площадью.

%Удаление объектов, площадь которых меньше некоторой заданной величины (для удаления шума)

[mitka num]=bwlabel(L1,8);
feats=imfeature(mitka,'Area',8);
Areas=zeros(num);
for i=1:num;
 Areas(i)=feats(i).Area;
end;
idx=find(Areas>750);
L1=ismember(mitka,idx);
figure,imshow(L1);title('После удаления шума (небольших объектов)');

 

Удалим также и другие объекты на сегментированном изображении лица.

L1=1-L1;

[mitka num]=bwlabel(L1,8);
feats=imfeature(mitka,'Area',8);
Areas=zeros(num);
for i=1:num;
 Areas(i)=feats(i).Area;
end;
idx=find(Areas>750);
L1=ismember(mitka,idx);
L1=1-L1;
figure,imshow(L1);
title('После удаления шума (небольших объектов)');

 

Здесь следует отметить, что выбранного нами критерия может быть недостаточно для достоверного определения объекта поиска, т.е. изображения лица. Такое может произойти в том случае, если на изображении присутствуют другие объекты с похожим цветом, лицо может быть в тени, быть под наклоном и т.п. Поэтому необходимо использовать также другие критерии для поиска изображения лица. Такие критерии могут базироваться на априорной информации о форме лица.

Таким образом, для повышения достоверности распознавания критерий поиска лица на изображении должен быть комплексным.

Далее проводим выделение выбранного лица, например, прямоугольником.

MIN_i=N;MIN_j=M;MAX_i=0;MAX_j=0;
for i=1:N;
 disp(i);
 for j=1:M;
 if L1(i,j)==1; 
 if iMAX_i;
 MAX_i=i;
 end;
 if j>MAX_j;
 MAX_j=j; 
 end;
 end;
 end;
end;
 
figure, imshow(L);
line([MIN_j MAX_j],[MIN_i MIN_i]);hold on;
line([MAX_j MAX_j],[MIN_i MAX_i]);
line([MAX_j MIN_j],[MAX_i MAX_i]);
line([MIN_j MIN_j],[MIN_i MAX_i]);hold off;

 

Программа, реализующая приведенный выше метод:

%==========ОБНАРУЖЕНИЕ ЛИЦ НА ОСНОВЕ ЦВЕТА=======
clear;
%Считывание исходного изображения 
L=imread('im.jpg'); 
[N M s]=size(L);
L=double(L)./255;
figure, imshow(L);title('Исходное изображение');

%Выбор пикселей лица с характерным цветом
[x,y,z]=impixel;
r=median(z(:,1)); std_r=std(z(:,1)); 
g=median(z(:,2)); std_g=std(z(:,2)); 
b=median(z(:,3)); std_b=std(z(:,3)); 
 
%Сегментация на основе анализа цвета
for i=1:N;
 disp(i);
 for j=1:M;
 if (abs(L(i,j,1)-r)<std_r)&(abs(L(i,j,2)-g)<std_g)&(abs(L(i,j,3)-b)<std_b);
 L1(i,j)=1;
 else
 L1(i,j)=0;
 end;
end;
end;
figure, imshow(L1);title('Исходное изображение после сегментации');
 
%Удаление объектов, площадь которых меньше некоторой
 заданной величины (для удаления шума)
[mitka num]=bwlabel(L1,8);
feats=imfeature(mitka,'Area',8);
Areas=zeros(num);
for i=1:num;
 Areas(i)=feats(i).Area;
end;
idx=find(Areas>750);
L1=ismember(mitka,idx);
figure,imshow(L1);title('После удаления шума (небольших объектов)');
 
L1=1-L1;
 
[mitka num]=bwlabel(L1,8);
feats=imfeature(mitka,'Area',8);
Areas=zeros(num);
for i=1:num;
 Areas(i)=feats(i).Area;
end;
idx=find(Areas>750);
L1=ismember(mitka,idx);
L1=1-L1;
figure,imshow(L1);title('После удаления шума (небольших объектов)');
 
%STATS = regionprops(L1,'Eccentricity');
 
MIN_i=N;MIN_j=M;MAX_i=0;MAX_j=0;
for i=1:N;
 disp(i);
 for j=1:M;
 if L1(i,j)==1; 
 if iMAX_i;
 MAX_i=i;
 end;
 if j>MAX_j;
 MAX_j=j; 
 end;
 end;
 end;
end;
 
figure, imshow(L);
line([MIN_j MAX_j],[MIN_i MIN_i]);hold on;
line([MAX_j MAX_j],[MIN_i MAX_i]);
line([MAX_j MIN_j],[MAX_i MAX_i]);
line([MIN_j MIN_j],[MIN_i MAX_i]);hold off;

Если же на изображении присутствует несколько лиц одновременно, то рассмотренный выше метод необходимо модифицировать. Рассмотрим это более детально. Первые несколько шагов (считывание исходного изображения, выбор характерных пикселей, сегментация и фильтрация) аналогичны, как и в предыдущем методе, поэтому мы приведем только результаты выполнения этих операций.


Исходное изображение

 


Исходное изображение после сегментации

 


Изображение после фильтрации объектов, которые представлены пикселями со значениями равными 1.

 


Изображение после фильтрации объектов, которые представлены пикселями со значениями равными 0.

 

Далее необходимо проанализировать объекты на изображении. Сначала с помощью функции bwlabel определим общее количество объектов на изображении и отметим их.

Lmitky = bwlabel(L1,4);
figure,imshow(Lmitky);


Изображение меток

 

На основе анализа условий съемки и площадей отмеченных объектов определяем расположение лиц на изображении.

H=hist(Lmitky(:),max(max(Lmitky)));
Nomer=find(H>4000);

Конечно, для повышения достоверности определения лиц на изображении, нужно использовать также и другие критерии, которые могут базироваться на основе анализа формы изображения лица.

figure, imshow(L);
for r=2:length(Nomer);
 MIN_i=N;MIN_j=M;MAX_i=0;MAX_j=0; 
 for i=1:N;
 for j=1:M;
 if Lmitky(i,j)==Nomer(r);
 if iMAX_i;
 MAX_i=i;
 end;
 if j>MAX_j;
 MAX_j=j; 
 end; 
 end;
 end;
 end;
 line([MIN_j MAX_j],[MIN_i MIN_i]);hold on;
 line([MAX_j MAX_j],[MIN_i MAX_i]);
 line([MAX_j MIN_j],[MAX_i MAX_i]);
 line([MIN_j MIN_j],[MIN_i MAX_i]);hold off; 
end;


Результат

 

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

 

Модифицированная программа для обнаружения нескольких лиц на изображении:

%==========ОБНАРУЖЕНИЕ ЛИЦ НА ОСНОВЕ ЦВЕТА=======
clear;
%Считывание исходного изображения 
L=imread('kids.bmp'); 
%L=imread('im.jpg'); 
[N M s]=size(L);
L=double(L)./255;
figure, imshow(L);title('Исходное изображение');

%Выбор пикселей лица с характерным цветом
[x,y,z]=impixel;
r=median(z(:,1)); std_r=std(z(:,1)); 
g=median(z(:,2)); std_g=std(z(:,2)); 
b=median(z(:,3)); std_b=std(z(:,3)); 
 
%Сегментация на основе анализа цвета
for i=1:N;
 disp(i);
 for j=1:M;
 if (abs(L(i,j,1)-r)<std_r)&(abs(L(i,j,2)-g)<std_g)&(abs(L(i,j,3)-b)<std_b);
 L1(i,j)=1;
 else
 L1(i,j)=0;
 end;
end;
end;
figure, imshow(L1);title('Исходное изображение после сегментации');
imwrite(L1,'Исходное изображение после сегментации.jpg');
 
%Удаление объектов, площадь которых меньше
 некоторой заданной величины (для удаления шума)
[mitka num]=bwlabel(L1,8);
feats=imfeature(mitka,'Area',8);
Areas=zeros(num);
for i=1:num;
 Areas(i)=feats(i).Area;
end;
idx=find(Areas>5750);
L1=ismember(mitka,idx);
figure,imshow(L1);title('После удаления шума (небольших объектов)');

L1=1-L1;
 
[mitka num]=bwlabel(L1,8);
feats=imfeature(mitka,'Area',8);
Areas=zeros(num);
for i=1:num;
 Areas(i)=feats(i).Area;
end;
idx=find(Areas>5750);
L1=ismember(mitka,idx);
L1=1-L1;
figure,imshow(L1);title('После удаления шума (небольших объектов)');

%STATS = regionprops(L1,'Eccentricity');
Lmitky = bwlabel(L1,4);
figure,imshow(Lmitky);
imwrite(Lmitky,'Изображение меток.jpg');
figure, imshow(L);
H=hist(Lmitky(:),max(max(Lmitky)));
Nomer=find(H>4000);
for r=2:length(Nomer);
 MIN_i=N;MIN_j=M;MAX_i=0;MAX_j=0; 
 for i=1:N;
 for j=1:M;
 if Lmitky(i,j)==Nomer(r);
 if iMAX_i;
 MAX_i=i;
 end;
 if j>MAX_j;
 MAX_j=j; 
 end; 
 end;
 end;
 end;
 line([MIN_j MAX_j],[MIN_i MIN_i]);hold on;
 line([MAX_j MAX_j],[MIN_i MAX_i]);
 line([MAX_j MIN_j],[MAX_i MAX_i]);
 line([MIN_j MIN_j],[MIN_i MAX_i]);hold off; 
end;

 


Добавляешь на форму Edit-(сюда будешь вводить значения для поиска). ComboBox-(Поля БД для поиска). Любую кнопку (к примеру Button)
ADOTable1->Locate(ComboBox1->Text,Edit1->Text, TLocateOptions() << loCaseInsensitive);

Добавляешь на форму Edit-(сюда будешь вводить значения для поиска). ComboBox-(Поля БД для поиска). Любую кнопку (к примеру Button)
ADOTable1->Locate(ComboBox1->Text,Edit1->Text, TLocateOptions() << loCaseInsensitive);


 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.IO;

namespace Compiler
{
 public partial class Form1 : Form
 {
 public Form1()
 {
 InitializeComponent();
 }
 
 private void button1_Click(object sender, EventArgs e)
 {
 CSharpCodeProvider cs = new CSharpCodeProvider();
 CompilerParameters param = new CompilerParameters();
 //Указываем путь сборки.
 param.OutputAssembly = "program.dll";
 //Указываем путь к исхдному коду и компилируем.
 //Так же можно можно вместо "code.txt" указать массив строк.
 cs.CompileAssemblyFromFile(param, "code.txt");
 }
 }
}

 


#include <iostream>

using namespace std;

int myAbs(int a){
 int oldByte = (a >> 31)& 0x1;
 return -a*(1+oldByte-1)-a*(oldByte-1);
}

int getMax(int a, int b) {
 return (a + b + myAbs(a - b)) / 2;
}

int getMin(int a, int b) {
 return (a + b - myAbs(a - b)) / 2;
}

int main() {
 int arr[] = {34, 12, 24, 65, 63, 22};
 int arraySize = (sizeof(arr) / sizeof(*arr));

 int maxPosition = 0;
 int maxElement = arr[0];
 int minValue= arr[0];
 for (int k = 0; k < arraySize; k++) {
 for (int i = k; i < arraySize; i++) {
 int newMax = getMax(maxElement, arr[i]);
 minValue = getMin(minValue, arr[i]);
 maxPosition =getMin((myAbs(newMax ^ maxElement) + 1) * (maxPosition + 1), (myAbs(newMax ^ arr[i]) + 1) * (i + 1)) -1;
 maxElement = newMax;
 }
 int buf = arr[k];
 arr[k] = maxElement;
 arr[maxPosition] = buf;
 maxElement = minValue;
 }
 for(int a:arr){
 cout<<a<<endl;
 }
 return 0;
}

 


Ниже приведен код и небольшое описание того, как можно это осуществить.

Для того, чтобы можно было использовать обученую нейросети вне среды MATLAB нужно воспользоваться специальной функцией, которая есть в матлабе начиная с r2014:

Syntax

genFunction(net,pathname)
genFunction(___,'MatrixOnly','yes')
genFunction(___,'ShowLinks','no')

Description

 

genFunction(net,pathname) generates a complete stand-alone MATLAB® function for simulating a neural network including all settings, weight and bias values, module functions, and calculations in one file. The result is a standalone MATLAB function file. You can also use this function with MATLAB Compiler™ and MATLAB Coder™ tools.

 

genFunction(___,'MatrixOnly','yes') overrides the default cell/matrix notation and instead generates a function that uses only matrix arguments compatible with MATLAB Coder tools. For static networks, the matrix columns are interpreted as independent samples. For dynamic networks, the matrix columns are interpreted as a series of time steps. The default value is 'no'.

genFunction(___,'ShowLinks','no') disables the default behavior of displaying links to generated help and source code. The default is 'yes'.

 

Ниже приведён небольшой пример:

Для начала создадим и обучим нейросеть:

[x,t] = house_dataset;
houseNet = feedforwardnet(10);
houseNet = train(houseNet,x,t);
y = houseNet(x);

Дальше сгенерируем и протестируем MATLAB функцию. Последняя строка - это компиляция функции обученой нейросети в dll.

genFunction(houseNet,'houseFcn');
y2 = houseFcn(x);
accuracy2 = max(abs(y-y2))
mcc -W lib:libHouse -T link:lib houseFcn
  •  

Форма входа
Пошук
Друзі сайту
Погода у Вінниці