iOS

נהנתם ? קנו לנו בירה :)

המדורגים ביותר בקטגוריה

  • תוכניתן פרילאנסר צד-שרת ב- בייזנסייט
    כתב בכיר
    15 פרסומים
  • מפתח PHP ב- Zend
    מפתח
    62 פרסומים
  • אדמיניסטרציה ב- טריניטי
    אחר
    9 פרסומים
  • מפתח
    4 פרסומים
  • מפתח ב- צבא ההגנה לישראל
    מפתח
    6 פרסומים

הודעות פורום אחרונות

פיתוח אפליקציות לכל הסמארטפונים עם Flash Builder 4.5 for PHP

2322 צפיות
מאת עמית דר פורסם ב- 20 May 2011, 00:54
קטגוריות: PHP, ActionScript, Flash, iOS, Android
https://www.adobe.com/images/shared/product_mnemonics/100x100/flash_builder_100x100.jpg
פיתוח אפליקציה על סמארטפונים היא בעיה ידועה, לכל מכשיר יש מערכת הפעלה שונה ושפה שונה לפיתוח. ישנו iOS, אנדרואיד ובלאקברי כך שפיתוח אפליקציה אחת לכולם הופכת למסובכת פי כמה.

הרבה חברות טובות ניסו ליצור איזושהי מעטפת או סביבה שתאפשר פיתוח חד פעמי של אפליקציה וקימפולה למספר סמאטפונים בלי לשכתב את הקוד.
עכשיו נכנסה לזירה Adobe עם Flash builder 4.5.

זיהוי קולי לאייפון איך ניתן לעשות זאת

1622 צפיות
מאת ערן גרוס פורסם ב- 16 May 2011, 14:57
קטגוריות: iOS
זיהוי קולי לאייפון, או כמו שנאמר voice recognition.

לאחרונה אנו עדים לצורך הולך וגובר של אפלקציות מבוססות זיהוי קולי.
יש הרבה ספריות לצורך זיהוי קולי אך הן עולות הרבה כסף למפתחים.
במאמר זה נסביר איך ניתן לעשות זאת ובחינם!!!

לפני שאנו מתחילים עלינו להוריד את הקבצים הבאים:

1. ספריית OpenEars המבוססת על CMU Sphinx
...ספריית OpenEars

2. ספריית sphinxbase
...ספריית sphinxbase

3. ספריית pocketsphinx

ספריית pocketsphinx

4. ספריית Flite
ספריית flite

5. ספריית Flite למעשה ממירה את הטקסט לקול, להורדת הקול
הורדת הקול


צעד ראשון

1. אחרי שהורדנו את כל הקבצים נפרוס את הקובץ הראשון בספריית הפרוייקטים שלנו, וזאת הכוונה ל OpenEars

2.אחרי שפרסנו את OpenEars נעתיק את את שאר הקבצים שהורדנו לתוך
OpenEars/CMULibraries


3. אחרי שהעתקנו את כל הקבצים אנחנו נפרוס את כולם בתוך ספריית CMULibraries

ספריית CMULibraries צריכה לראות כך:

http://www.politepix.com/wp-content/uploads/OpenEars/folder2.png

חשוב לציין ששמות הסיפריות צריכות להיות כדלקמן:

flite-1.4-release

pocketsphinx-0.6.1

sphinxbase-0.6.1

wince



חשוב להדגיש שספריית OpenEars תעבוד רק עם הגרסאות שציינו, נא לא להוריד גרסאות חדשות מידי.


4. אז אחרי שפרסנו ובדקנו שהכל בסדר נפתח את חלון התרמינל וניגש לספריית CMULibraries

cd [Location_OF_OpenEars_Folder/CMULibraries]


ואז נריץ את הסקריפט

./InstallOpenEars.pl



5. אחרי שהסקריפט רץ וסיים בהצלחה ניגש לערוך מספר שינויים לפרוייקט

נפתח את הפרוייקט בעזרת ה Xcode שלנו, נוכל למצוא את מיקומו כאן:

[OpenEars_Folder/OpenEarsLibrary/OpenEarsLibrary.xcodeproj]


נעמוד על הפרוייקט ובחלון הימני נוכל לערוך את פרטיו (project info)
נשנה את ערך השדה "Base SDK for All Configurations"
ל device ולא לסימולטור

בנוסף נוריד את האופציה שמסומנת כברירת מחדל compile for thumb

עכשיו אפשר לסגור את הפרוייקט.
מזל טוב יש לכם ספרייה סטטית של זיהוי קולי.



אז יצרנו ספרייה של זיהוי קולי עכשיו ניצור פרוייקט חדש ונשתמש בה.

1. ניצור ב Xcode פרוייקט חדש אפשר להשתמש בתבניות הקיימות

2. נוסיף את הקבצים הבאים מהפרוייקט ספריית OpenEars לפרוייקט החדש שייצרנו.

OpenEars/OpenEarsLibrary.xcodeproj

OpenEars/OpenEarsLibrary/Classes/include/OpenEarsConfig.h

OpenEars/CMULbraries/flite-1.4-release/include/OpenEarsVoiceConfig.h



חשוב לציין שאנו לא מעתיקים לספריית הפרוייקט החדש אלה מייצרים קישורים

זאת אומרת כך:

http://www.politepix.com/wp-content/uploads/OpenEars/referencesettings.png



3. נוסיף את הספרייה הבאה

OpenEars/CMULibraries/pocketsphinx-0.6.1/model/hmm/en_US/hub4wsj_sc_8k


אנו אמורים לראות חלון הדומה לזה (ב Xcode 4 זה קצת נראה אחרת)

http://www.politepix.com/wp-content/uploads/OpenEars/project1.2.png


4. נסמן את הפרוייקט שלנו ונראה מצד ימין חלון עם שם הספרייה libOpenEarsLibrary.a ומימין לה checkbox קטן נסמן אותו

http://www.politepix.com/wp-content/uploads/OpenEars/project2.2.png

5. נערוך את ה target שלנו נבחר בטאב General
נוכל למצוא שם שתי קטגוריות

Direct Dependencies 

Linked Libraries


לכל קטגוריה יש כפתור + בחלק התחתון של החלון

נלחץ על כפתור ה + ונוסיף ל Direct Dependecies את הספרייה - נלחץ על כפתור "Add Targets"

http://www.politepix.com/wp-content/uploads/OpenEars/dependencies2.png

נלחץ על כפתור ה + פעם נוספת הפעם נוסיף ל linked libraries את הספריות הבאות

AudioToolbox.framework

AVFoundation.framework

libiconv.2.4.0.dylib



אפל אישרה שניתן להשתמש ב libiconv.2.4.0.dylib מכיוון שהיא מכילה public header

6. ניגש שוב לערוך את ה Target שלנו ונוסיף את הנתיבים הבאים שלנו לשדה Header search path

לא לשכוח לסמן All Configurations

OpenEars/CMULibraries/flite-1.4-release/include

OpenEars//CMULibraries/pocketsphinx-0.6.1/include

OpenEars/CMULibraries/sphinxbase-0.6.1/include

OpenEars//OpenEarsLibrary/Classes/include



7. ערוך שוב את הproject setting ותוריד את האופציה "Compile for Thumb" ( זה רלוונטי לגרסאות ישנות יותר אבל לא מזיק)

8. בשלב הזה נבדוק אם אנו יכולים להריץ את הפרוייקט הריק שלנו בתוספת קטנה.

נוסיף את הקבצים הבאים ל delegate class

#import "AudioSessionManager.h"
 
#import "OpenEarsEventsObserver.h"

#import "PocketsphinxController.h"

#import "FliteController.h"



9. אחרי שסיימנו ובדקנו שהכל תקין אנחנו עוברים לשלב בניית מודל השפה שלנו.
דבר ראשון אנו ניצור קובץ טקסט נקרא לו corpus.txt
נוסיף מספר מילים בסיסי לקובץ זה

UP
Down
Left
Right

נשמור את הקובץ

אם אתם רוצים לשים משפט שלם אתם יכולים

לדוגמא

Hi My Name Is Eran


נא לשמור את הקובץ במקום שאתם רוצים

עכשיו נשתמש בכלי של CMU לטובת יצירת המודל

נא לפתוח דף זה
LMTools

תבחרו choose file תסמנו את קובץ corpus.txt ותבחרו בכפתור COMPILE KNOWLEDGE BASE

הדף ייצר לכם לינק ל zip נא להוריד אותו ןלפתוח אותו.

תמצאו בתוך ה zip קובץ עם סיומת של lm נא לשנות את סיומת הקובץ ל languagemodel
בנוסף יש קובץ עם סיומת dic תעתיקו את שני הקבצים האלה לפרוייקט שלכם ותוסיפו אותם לפרוייקט (כמובן ניתן לעשות זאת בפעולה אחת).


10. נערוך את קובץ OpenEarsConfig.h

ונוודא שאנו משתמשים languagemodel ןב dict שייצרנו

#define kLanguageModelName @"OpenEars.languagemodel" // Enter the name of your language model file here between the quotes.
#define kDictionaryName @"OpenEars.dic" // Enter the name of your dictionary file here between the quotes.



אם נתתם להם שמות אחרים, נא לשנות בהתאם.(כמובן שסיומת של הקבצים צריכה להיות זהה)

בשלב זה נדבר על 4 classes של OpenEars

 AudioSessionManager

 PocketsphinxController

 FliteController

 OpenEarsEventsObserver




איך ניתן להשתמש ב AudioSessionManager. או בקיצור אודיו.

אודיו אחראי למעשה על יצירת האודיו session וגם אחראי לספר לנו כאשר אנו מקבלים שיחה מבחוץ לכן חשוב מאוד ליצור את האובייקט כאשר אפלקצייה מתחילה לרוץ.
דוגמא טובה יכולה להיות, ליצור אובייקט זה ולאתחל אותו ב delegate class.

נוסיף ל delegate


#import "AudioSessionManager.h

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;


AudioSessionManager *myAudioSessionManager = [[AudioSessionManager alloc]init];




יפה אז יצרו אובייקט ואתחלנו אותו.

ה class הבא

PocketsphinxController האחראי על זיהוי הדיבור של המשתמש, ניתן להוסיף אותו בכל עת לכל class קיים על ידי הוספת

#import "PocketsphinxController"


ואז לאתחל אותו באותה צורה שאתחלנו את האובייקט הקודם.(אין צורך להדגים שוב)


אחר כך ניתן להשתמש באובייקט לצרכים הבאים


[self.myPocketSphinxController startListening];
[self.myPocketSphinxController stopListening];
[self.myPocketSphinxController suspendRecognition];
[self.myPocketSphinxController resumeRecognition];




startListening מתחיל את הזיהוי הקולי, תהליך זה לוקח מספר שניות הייתי טוען אותו לפני שה view עולה.

stopListening לעצור את הזיהוי הקולי

suspendRecognition לא עוצר את הזיהוי הקולי אך אבל הוא מפסיק לעבד קול חדש.

resumeRecognition מחזיר לפעילות את עיבוד הקול.

ה class הבא FliteController.h ממיר text ל speech

ניתן להשתמש בו כך:


[self.fliteController say:@"Hi my name is Eran"."];




ה class הנוסף OpenEarsEventsObserver

אחראי על האינופרמציה של מה שקורה עם AudioSession, Pocketsphinx, Flite
דוגמאות

#import "OpenEarsEventsObserver.h"

@interface OpenEarsSampleProjectViewController : UIViewController <OpenEarsEventsObserverDelegate> {
[self.myOpenEarsEventsObserver setDelegate:self];

 

עכשיו נוכל להשתמש במתודות של OpenEarsEventsObserver delegate
לדוגמא


// Audio Session Status Methods.
- (void) audioSessionInterruptionDidBegin; // There was an interruption.
- (void) audioSessionInterruptionDidEnd; // The interruption ended.
- (void) audioInputDidBecomeUnavailable; // The input became unavailable.
- (void) audioInputDidBecomeAvailable; // The input became available again.
- (void) audioRouteDidChangeToRoute:(NSString *)newRoute; // The audio route changed.
// Pocketsphinx Status Methods.
- (void) pocketsphinxDidStartCalibration; // Pocketsphinx isn't listening yet but it started calibration.
- (void) pocketsphinxDidCompleteCalibration; // Pocketsphinx isn't listening yet but calibration completed.
- (void) pocketsphinxRecognitionLoopDidStart; // Pocketsphinx isn't listening yet but it has entered the main recognition loop.
- (void) pocketsphinxDidStartListening; // Pocketsphinx is now listening.
- (void) pocketsphinxDidDetectSpeech; // Pocketsphinx heard speech and is about to process it.
- (void) pocketsphinxDidReceiveHypothesis:(NSString *)hypothesis recognitionScore:(NSString *)recognitionScore utteranceID:(NSString *)utteranceID; // Pocketsphinx has recognized speech.
- (void) pocketsphinxDidStopListening; // Pocketsphinx has exited the continuous listening loop.
- (void) pocketsphinxDidSuspendRecognition; // Pocketsphinx has not exited the continuous listening loop but it will not attempt recognition.
- (void) pocketsphinxDidResumeRecognition; // Pocketsphinx has not exited the continuous listening loop and it will now start attempting recognition again.
// Flite Status Methods.
- (void) fliteDidStartSpeaking; // Flite started speaking.
- (void) fliteDidFinishSpeaking; // Flite finished speaking.





זהו,
תהנו
ערן גרוס

עיבוד תמונה ישירות מאייפון שלכם

1299 צפיות
מאת ערן גרוס פורסם ב- 16 May 2011, 10:41
קטגוריות: iOS
דמיינו שארגון בטחוני היה מעוניין שאנשיו בשטח יוכלו לצלם את הרעים אבל מכיוון שיש כל כך הרבה רעים או כל יום יש רע חדש יש צורך לצלם ולעבד את המידע בזמן אמת פה נכנס לתמונה האיפון שלכם, כן כן האייפון שלכם. בעזרת opencv ניתן לעבד את התמונה בזמן אמת לזיהוי תבניות ולביצוע התאמה.
אז איך עושים זאת? נשתמש בספרייה שפותחה במיוחד לצורך זה בשם OpenCV.
ספרייה זו מאפשרת לנו בצורה קלה יחסית לזהות פנים או תנועות גוף, לדוגמא חיוך(על ידי אימון מקדים).

דבר ראשון ניתן להוריד דוגמא של אפליקציה מבוססת על ספריית OpenCV בקישור הבא:
 
הורדת הדוגמא

תמצאו כפתור Downloads מצד ימין.

אחרי שהורדתם את הפרוייקט ניתן לפתוח אותו בעזרת Xcode להדר אותו ולהריץ אותו.
יופיעו לכם שתי "מטרות" Targets גם למכשיר האייפון וגם לסימולטור.

בניית OpenCV מקוד מקור

1. בניית OpenCV דורשת שימוש ב CMAKE לכן נטרך להתקין CMAKE למי שלא מותקן לו.
ישנן שתי דרכים להתקין בצורה נוחה רכיבי תוכנה אחד זה שימוש ב MacPorts מאוד מומלץ אז נא להוריד.
השנייה Homebrew

אחרי שהורדתם והתקנתם אחת מהן, נעזר בהן להתקנת CMAKE

נפתח חלון תרמינל חדש

במידה והתקנו Macports נריץ את הפקודה

sudo port install cmake -gui


במידה ואנחנו משתשמשים ב Homebrew נריץ את הפקודה

brew install cmake


2. אחרי שהתקנו cmake ניגש להורדת ספריית OpenCV

ספריית OpenCV ניתן להוריד מכאן

הורדת קוד מקור של OpenCV


3.נפתח את הקובץ המכווץ על גבי ספריית פרוייקט הדמו.

tar xjvf OpenCV-2.2.0.tar.bz2


4. נריץ תיקון קטן בשביל שספריית OpenCV תתאים לאייפון

cd OpenCV-2.2.0

patch -p1 < ../OpenCV-2.2.0

5. בניית הספרייה (סטטית)

cd .. # Back to the top of demo project directory

mkdir build_simulator

cd build_simulator

../opencv_cmake.sh Simulator ../OpenCV-2.2.0

# Here you need to choose the number according the number of your CPUs in your computer.
make -j 4

make install


6.כעת נעשה אותו דבר גם למכשיר להזכירכם סעיף 5 מטפל בסימולטור

cd .. #Back to the top of the demo project

mkdir build_device
cd bulid_deviec
../opencv_cmake.sh Device ../OpenCV-2.2.0
make -j 4 # here are the number of CPUs on your computer.
make install

7. כאשר אנו רוצים להגדיר אובייקט של תמונה ב
OpenCV
אנחנו משתמשים ב class IplImage

כאשר אנחנו משתמשים באובייקט לתמונה ב IOS אנחנו משתמשים ב UIImage
לכן יש צורך להמיר בין שני הפורמטים

1. יצירת IplImage מ UIImage


// NOTE you SHOULD cvReleaseImage() for the return value when end of the code.
- (IplImage *)CreateIplImageFromUIImage:(UIImage *)image {
  // Getting CGImage from UIImage
  CGImageRef imageRef = image.CGImage;

  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  // Creating temporal IplImage for drawing
  IplImage *iplimage = cvCreateImage(
    cvSize(image.size.width,image.size.height), IPL_DEPTH_8U, 4
  );
  // Creating CGContext for temporal IplImage
  CGContextRef contextRef = CGBitmapContextCreate(
    iplimage->imageData, iplimage->width, iplimage->height,
    iplimage->depth, iplimage->widthStep,
    colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault
  );
  // Drawing CGImage to CGContext
  CGContextDrawImage(
    contextRef,
    CGRectMake(0, 0, image.size.width, image.size.height),
    imageRef
  );
  CGContextRelease(contextRef);
  CGColorSpaceRelease(colorSpace);

  // Creating result IplImage
  IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3);
  cvCvtColor(iplimage, ret, CV_RGBA2BGR);
  cvReleaseImage(&iplimage);

  return ret;
}


נא לא לשכוח לשחרר את האובייקט
IplImage
מהזיכרון

2. יצירת UIImage
מ
IplImage


// NOTE You should convert color mode as RGB before passing to this function
- (UIImage *)UIImageFromIplImage:(IplImage *)image {
  CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  // Allocating the buffer for CGImage
  NSData *data =
    [NSData dataWithBytes:image->imageData length:image->imageSize];
  CGDataProviderRef provider =
    CGDataProviderCreateWithCFData((CFDataRef)data);
  // Creating CGImage from chunk of IplImage
  CGImageRef imageRef = CGImageCreate(
    image->width, image->height,
    image->depth, image->depth * image->nChannels, image->widthStep,
    colorSpace, kCGImageAlphaNone|kCGBitmapByteOrderDefault,
    provider, NULL, false, kCGRenderingIntentDefault
  );
  // Getting UIImage from CGImage
  UIImage *ret = [UIImage imageWithCGImage:imageRef];
  CGImageRelease(imageRef);
  CGDataProviderRelease(provider);
  CGColorSpaceRelease(colorSpace);
  return ret;
}





על מנת שנוכל להשתמש ב OpenCV
בפרוייקט שלנו יש צורך להוסיף לפרוייקט מספר קבצים

1. libopencv_core.a

ניתן למצוא זאת בספריית lib
של OpenCV

2. Accelerate.framework

3. ערוך את ה Target
הרצוי ובהגדרות תוסיף לשדה
Other Linker Flags

-lstdc++
וגם
-lz

4. תוסיף את נתיב הספרייה include
של OpenCV
לשדה ההגדרות Header Search Path
גם ל targets
של המכשיר ושל הסימולטור

5. תוסיף נתיב ספריה lib
של OpenCV
לשדה ההגדרות Library Search Paths
גם ל targets
של המכשיר ושל הסימולטור

מקווה שתהנו
ערן גרוס
דף