SlideShare a Scribd company logo
1 of 117
Download to read offline
#360iDev@CarlBrwn
Apps That
Can See
Carl Brown
Missing Last Vowel -
I blame Flickr/Tumblr
1Monday, September 9, 13
@CarlBrwn #360iDev
Computer Vision?
Turning Photos Into Useable
Data
Image Analysis
Colors
Shapes
Numbers & Letters
2Monday, September 9, 13
@CarlBrwn #360iDev
Word Lens
http://www.youtube.com/watch?v=h2OfQdYrHRs
3Monday, September 9, 13
@CarlBrwn #360iDev
Word Lens
http://www.youtube.com/watch?v=h2OfQdYrHRs
3Monday, September 9, 13
@CarlBrwn #360iDev
Today's Talk
How quick and easy it is to get
actionable info from photos
4Monday, September 9, 13
@CarlBrwn #360iDev
Today's Talk
How quick and easy it is to get
actionable info from photos
Demo Code with Source
4Monday, September 9, 13
@CarlBrwn #360iDev
Today's Talk
How quick and easy it is to get
actionable info from photos
Demo Code with Source
Not about HOW OpenCV works
4Monday, September 9, 13
@CarlBrwn #360iDev
Today's Talk
How quick and easy it is to get
actionable info from photos
Demo Code with Source
Not about HOW OpenCV works
"OpenCV by Example"
4Monday, September 9, 13
@CarlBrwn #360iDev
CubeCheater &
Sudoku Grab
http://www.youtube.com/watch?v=HNwx0nbgm7M http://www.youtube.com/watch?v=wt96OomJY9A
5Monday, September 9, 13
@CarlBrwn #360iDev
Both have had
Legal Problems
http://cubecheater.efaller.com http://sudokugrab.blogspot.com/2010/12/
sudoku-grab-removed-from-sale-in-japan.html
6Monday, September 9, 13
#360iDev@CarlBrwn
Based on
Code
From:
github.com/carlbrown/
OpenCVDemo360iDev2013
7Monday, September 9, 13
@CarlBrwn #360iDev
About the Code
Explicit and Redundant to make
it easier to follow/explain
8Monday, September 9, 13
@CarlBrwn #360iDev
About the Code
Explicit and Redundant to make
it easier to follow/explain
Not production ready -
for teaching purposes
8Monday, September 9, 13
@CarlBrwn #360iDev
About the Code
Explicit and Redundant to make
it easier to follow/explain
Not production ready -
for teaching purposes
Minimum Viable Interface
8Monday, September 9, 13
@CarlBrwn #360iDev
About the Code
Explicit and Redundant to make
it easier to follow/explain
Not production ready -
for teaching purposes
Minimum Viable Interface
Don't hate, okay?
8Monday, September 9, 13
#360iDev@CarlBrwn
Face
Counter
Demo 1/3
9Monday, September 9, 13
#360iDev@CarlBrwn
Core
Image
Option 1
10Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- coreImageButtonPressed:
[CIImage imageWithCGImage:]
Detect
11Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- coreImageButtonPressed:
[CIImage imageWithCGImage:]
[CIDetector detectorOfType:
! ! ! ! CIDetectorTypeFace]
Detect
11Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- coreImageButtonPressed:
[CIImage imageWithCGImage:]
[CIDetector detectorOfType:
! ! ! ! CIDetectorTypeFace]
NSArray *features= [detector
! ! ! ! ! ! featuresInImage:]
Detect
11Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- coreImageButtonPressed:
[CIImage imageWithCGImage:]
[CIDetector detectorOfType:
! ! ! ! CIDetectorTypeFace]
NSArray *features= [detector
! ! ! ! ! ! featuresInImage:]
for(CIFaceFeature* faceFeature
!! ! ! ! ! ! ! in features)
Detect
11Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- coreImageButtonPressed:
for(CIFaceFeature* faceFeature
!! ! ! ! ! ! ! in features)
Debugging
12Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- coreImageButtonPressed:
for(CIFaceFeature* faceFeature
!! ! ! ! ! ! ! in features)
frame = faceFeature.bounds
Debugging
12Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- coreImageButtonPressed:
for(CIFaceFeature* faceFeature
!! ! ! ! ! ! ! in features)
frame = faceFeature.bounds
frame *= contentScaleFactor
Debugging
12Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- coreImageButtonPressed:
for(CIFaceFeature* faceFeature
!! ! ! ! ! ! ! in features)
frame = faceFeature.bounds
frame *= contentScaleFactor
//flip to CIImage Coords
Debugging
12Monday, September 9, 13
@CarlBrwn #360iDev
Coordinate
Systems
UIView has (0,0) at Upper Left
Core Image has (0,0) Lower Left
(Like OS X)
13Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- coreImageButtonPressed:
for(CIFaceFeature* faceFeature
!! ! ! ! ! ! ! in features)
frame = faceFeature.bounds
frame *= contentScaleFactor
//flip to CIImage Coords
Debugging
14Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- coreImageButtonPressed:
for(CIFaceFeature* faceFeature
!! ! ! ! ! ! ! in features)
frame = faceFeature.bounds
frame *= contentScaleFactor
//flip to CIImage Coords
faceView.layer.borderWidth = 4;
Debugging
14Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- coreImageButtonPressed:
for(CIFaceFeature* faceFeature
!! ! ! ! ! ! ! in features)
frame = faceFeature.bounds
frame *= contentScaleFactor
//flip to CIImage Coords
faceView.layer.borderWidth = 4;
addSubview:faceView
Debugging
14Monday, September 9, 13
#360iDev@CarlBrwn
Core
Image
Option 1
15Monday, September 9, 13
#360iDev@CarlBrwn
OpenCV
Option 2
16Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- openCVButtonPressed:
convert to cv::Mat
Detect
17Monday, September 9, 13
@CarlBrwn #360iDev
Convert to cv::Mat
CGImageGetColorSpace(image.CGImage)
cv::Mat cvMat()
CGBitmapContextCreate(cvMat.data,...)
CGContextDrawImage(ctx,r,image.CGImage)
CGContextRelease()
18Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- openCVButtonPressed:
convert to cv::Mat
Detect
19Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- openCVButtonPressed:
convert to cv::Mat
cv::cvtColor( CV_BGR2GRAY )
Detect
19Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- openCVButtonPressed:
convert to cv::Mat
cv::cvtColor( CV_BGR2GRAY )
cv::equalizeHist()
Detect
19Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- openCVButtonPressed:
convert to cv::Mat
cv::cvtColor( CV_BGR2GRAY )
cv::equalizeHist()
cv::face_cascade.
! ! ! ! ! ! detectMultiScale()
Detect
19Monday, September 9, 13
@CarlBrwn #360iDev
Cascade Classifier
http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html
20Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- openCVButtonPressed:
convert to cv::Mat
cv::cvtColor( CV_BGR2GRAY )
cv::equalizeHist()
face_cascade.detectMultiScale()
Detect
21Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- openCVButtonPressed:
convert to cv::Mat
cv::cvtColor( CV_BGR2GRAY )
cv::equalizeHist()
face_cascade.detectMultiScale()
for( int i = 0;
! ! ! ! i < faces.size(); i++ )
Detect
21Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- openCVButtonPressed:
for( int i = 0;
! ! ! ! i < faces.size(); i++ )
Debugging
22Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- openCVButtonPressed:
for( int i = 0;
! ! ! ! i < faces.size(); i++ )
CGRectMake(faces[i].frame)
Debugging
22Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- openCVButtonPressed:
for( int i = 0;
! ! ! ! i < faces.size(); i++ )
CGRectMake(faces[i].frame)
frame *= contentScaleFactor
Debugging
22Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- openCVButtonPressed:
for( int i = 0;
! ! ! ! i < faces.size(); i++ )
CGRectMake(faces[i].frame)
frame *= contentScaleFactor
faceView.layer.borderWidth = 4;
Debugging
22Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- openCVButtonPressed:
for( int i = 0;
! ! ! ! i < faces.size(); i++ )
CGRectMake(faces[i].frame)
frame *= contentScaleFactor
faceView.layer.borderWidth = 4;
addSubview:faceView
Debugging
22Monday, September 9, 13
#360iDev@CarlBrwn
OpenCV
Option 2
23Monday, September 9, 13
#360iDev@CarlBrwn
Cube
Face
Grabber
Demo 2/3
24Monday, September 9, 13
#360iDev@CarlBrwn
Detect
Edges
detectFacesPressed:
25Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- detectFacesPressed:
convert to cv::Mat
Detect
26Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- detectFacesPressed:
convert to cv::Mat
cv::Canny()
Detect
26Monday, September 9, 13
@CarlBrwn #360iDev
Canny
27Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- detectFacesPressed:
convert to cv::Mat
cv::Canny()
Detect
28Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- detectFacesPressed:
convert to cv::Mat
cv::Canny()
cv::HoughLinesP()
Detect
28Monday, September 9, 13
@CarlBrwn #360iDev
HoughLinesP
29Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- detectFacesPressed:
convert to cv::Mat
cv::Canny()
cv::HoughLinesP()
Detect
30Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- detectFacesPressed:
convert to cv::Mat
cv::Canny()
cv::HoughLinesP()
for( size_t i = 0;
! ! ! i < lines.size(); i++ )
Detect
30Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- detectFacesPressed:
convert to cv::Mat
cv::Canny()
cv::HoughLinesP()
for( size_t i = 0;
! ! ! i < lines.size(); i++ )
if (LineIntersect(l, l2))
Detect
30Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- detectFacesPressed:
convert to cv::Mat
cv::Canny()
cv::HoughLinesP()
for( size_t i = 0;
! ! ! i < lines.size(); i++ )
if (LineIntersect(l, l2))
//Measure Distance to Image corners
Detect
30Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- detectFacesPressed:
for( size_t i = 0;
! ! ! i < lines.size(); i++ )
Debugging
31Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- detectFacesPressed:
for( size_t i = 0;
! ! ! i < lines.size(); i++ )
cv::line() //Draw
Debugging
31Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- detectFacesPressed:
for( size_t i = 0;
! ! ! i < lines.size(); i++ )
cv::line() //Draw
//Check for bounding corners
Debugging
31Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- detectFacesPressed:
for( size_t i = 0;
! ! ! i < lines.size(); i++ )
cv::line() //Draw
//Check for bounding corners
cv::circle() //Draw
Debugging
31Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- detectFacesPressed:
for( size_t i = 0;
! ! ! i < lines.size(); i++ )
cv::line() //Draw
//Check for bounding corners
cv::circle() //Draw
convert to UIImage //Display
Debugging
31Monday, September 9, 13
@CarlBrwn #360iDev
Convert to
UIImage
[NSData dataWithBytes:cvMat.data length:]
CGDataProviderCreateWithCFData()
CGImageCreate()
[[UIImage alloc] initWithCGImage:]
CGXXXRelease()
32Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- detectFacesPressed:
for( size_t i = 0;
! ! ! i < lines.size(); i++ )
cv::line() //Draw
//Check for bounding corners
cv::circle() //Draw
convert to UIImage //Display
Debugging
33Monday, September 9, 13
#360iDev@CarlBrwn
Detect
Edges
detectFacesPressed:
34Monday, September 9, 13
#360iDev@CarlBrwn
Unskew
getAndApplyTransformPressed:
35Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- getAndApplyTransformPressed:
convert to cv::Mat
36Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- getAndApplyTransformPressed:
convert to cv::Mat
getPerspectiveTransform()
36Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- getAndApplyTransformPressed:
convert to cv::Mat
getPerspectiveTransform()
warpPerspective(transform)
36Monday, September 9, 13
@CarlBrwn #360iDev
Map the Corners
circled on the Left
To the Corners of
the Images on the
Right
37Monday, September 9, 13
@CarlBrwn #360iDev
Map the Corners
circled on the Left
To the Corners of
the Images on the
Right
37Monday, September 9, 13
@CarlBrwn #360iDev
Map the Corners
circled on the Left
To the Corners of
the Images on the
Right
37Monday, September 9, 13
@CarlBrwn #360iDev
Map the Corners
circled on the Left
To the Corners of
the Images on the
Right
37Monday, September 9, 13
@CarlBrwn #360iDev
Map the Corners
circled on the Left
To the Corners of
the Images on the
Right
37Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- getAndApplyTransformPressed:
convert to cv::Mat
getPerspectiveTransform()
warpPerspective(transform)
38Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- getAndApplyTransformPressed:
convert to cv::Mat
getPerspectiveTransform()
warpPerspective(transform)
convert to UIImage //Display
38Monday, September 9, 13
#360iDev@CarlBrwn
Unskew
getAndApplyTransformPressed:
39Monday, September 9, 13
#360iDev@CarlBrwn
Extract
Colors
extractColorsPressed:
40Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractColorsPressed:
convert to cv::Mat
cv::cvtColor(CV_RGB2HSV)
Detect
41Monday, September 9, 13
@CarlBrwn #360iDev
HSV Space
Hue/Saturation/Value
Easier to get Color out
http://en.wikipedia.org/wiki/HSV_color_space
42Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractColorsPressed:
convert to cv::Mat
cv::cvtColor(CV_RGB2HSV)
Detect
43Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractColorsPressed:
convert to cv::Mat
cv::cvtColor(CV_RGB2HSV)
for (int hSlice;;) {
! ! for (int vSlice;;) {
Detect
43Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractColorsPressed:
convert to cv::Mat
cv::cvtColor(CV_RGB2HSV)
for (int hSlice;;) {
! ! for (int vSlice;;) {
cv::Rect r()
Detect
43Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractColorsPressed:
convert to cv::Mat
cv::cvtColor(CV_RGB2HSV)
for (int hSlice;;) {
! ! for (int vSlice;;) {
cv::Rect r()
Mat cv::roi(r)
Detect
43Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractColorsPressed:
convert to cv::Mat
cv::cvtColor(CV_RGB2HSV)
for (int hSlice;;) {
! ! for (int vSlice;;) {
cv::Rect r()
Mat cv::roi(r)
avgColor=cv::mean(roi)
Detect
43Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractColorsPressed:
convert to cv::Mat
cv::cvtColor(CV_RGB2HSV)
for (int hSlice;;) {
! ! for (int vSlice;;) {
cv::Rect r()
Mat cv::roi(r)
avgColor=cv::mean(roi)
//Check Saturation and Hue
Detect
43Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractColorsPressed:
for (int hSlice;;) {
! ! for (int vSlice;;) {
Debugging
44Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractColorsPressed:
for (int hSlice;;) {
! ! for (int vSlice;;) {
roi = avgColor //Fill
Debugging
44Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractColorsPressed:
for (int hSlice;;) {
! ! for (int vSlice;;) {
roi = avgColor //Fill
putText(roi, [color cString]
Debugging
44Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractColorsPressed:
for (int hSlice;;) {
! ! for (int vSlice;;) {
roi = avgColor //Fill
putText(roi, [color cString]
putText(roi, stringWithFormat:
@"%.0f/%.0f/%.0f")
Debugging
44Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractColorsPressed:
for (int hSlice;;) {
! ! for (int vSlice;;) {
roi = avgColor //Fill
putText(roi, [color cString]
putText(roi, stringWithFormat:
@"%.0f/%.0f/%.0f")
convert to UIImage //Display
Debugging
44Monday, September 9, 13
#360iDev@CarlBrwn
Extract
Colors
extractColorsPressed:
45Monday, September 9, 13
#360iDev@CarlBrwn
Sudoku
Grabber
Demo 3/3
46Monday, September 9, 13
#360iDev@CarlBrwn
Find
Edges
findPuzzlePressed:
47Monday, September 9, 13
@CarlBrwn #360iDev
Just like Cube
48Monday, September 9, 13
#360iDev@CarlBrwn
UnSkew
Puzzle
squarePressed:
49Monday, September 9, 13
@CarlBrwn #360iDev
Just like Cube
50Monday, September 9, 13
#360iDev@CarlBrwn
Extract
Text
extractPressed:
51Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractPressed:
Tesseract* tesseract =
Setup
52Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractPressed:
Tesseract* tesseract =
initWithDataPath:@"tessdata"
language:@"eng"
Setup
52Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractPressed:
Tesseract* tesseract =
initWithDataPath:@"tessdata"
language:@"eng"
tesseract
setVariableValue:@"0123456789"
forKey:@"tessedit_char_whitelist"
Setup
52Monday, September 9, 13
@CarlBrwn #360iDev
tesseract-ocr
http://code.google.com/p/tesseract-ocr/
53Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractPressed:
convert to cv::Mat
Slice
54Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractPressed:
convert to cv::Mat
for (int hSlice;;) {
! ! for (int vSlice;;) {
Slice
54Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractPressed:
convert to cv::Mat
for (int hSlice;;) {
! ! for (int vSlice;;) {
cv::Rect r()
Slice
54Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractPressed:
convert to cv::Mat
for (int hSlice;;) {
! ! for (int vSlice;;) {
cv::Rect r()
Mat cv::roi(r)
Slice
54Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractPressed:
convert to cv::Mat
for (int hSlice;;) {
! ! for (int vSlice;;) {
cv::Rect r()
Mat cv::roi(r)
cv::cvtColor(CV_RGB2GRAY);
Slice
54Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractPressed:
convert to cv::Mat
for (int hSlice;;) {
! ! for (int vSlice;;) {
cv::Rect r()
Mat cv::roi(r)
cv::cvtColor(CV_RGB2GRAY);
cv::threshold(roi_gray)
Slice
54Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractPressed:
convert slice to UIImage
Detect
55Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractPressed:
convert slice to UIImage
tesseract setImage:imageToParse
Detect
55Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractPressed:
convert slice to UIImage
tesseract setImage:imageToParse
tesseract recognize
Detect
55Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractPressed:
[[UILabel alloc]
initWithFrame:CGRectMake()]
Debugging
56Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractPressed:
[[UILabel alloc]
initWithFrame:CGRectMake()]
label
setText:recognizedString
Debugging
56Monday, September 9, 13
@CarlBrwn #360iDev
ViewController.mm
- extractPressed:
[[UILabel alloc]
initWithFrame:CGRectMake()]
label
setText:recognizedString
self.view
addSubview:recognizedLabel
Debugging
56Monday, September 9, 13
#360iDev@CarlBrwn
Extract
Text
extractPressed:
57Monday, September 9, 13
#360iDev@CarlBrwn
Based on
Code
From:
github.com/carlbrown/
OpenCVDemo360iDev2013
Questions?
58Monday, September 9, 13

More Related Content

Similar to Writing Apps that Can See: Getting Data from CoreImage to Computer Vision - 360iDev 2013 Presentation

Similar to Writing Apps that Can See: Getting Data from CoreImage to Computer Vision - 360iDev 2013 Presentation (15)

CloudExpo Frankfurt 2023 "Break me if you can: practical guide to building fa...
CloudExpo Frankfurt 2023 "Break me if you can: practical guide to building fa...CloudExpo Frankfurt 2023 "Break me if you can: practical guide to building fa...
CloudExpo Frankfurt 2023 "Break me if you can: practical guide to building fa...
 
What Does Your Smart Car Know About You? Strata London 2016
What Does Your Smart Car Know About You?  Strata London 2016What Does Your Smart Car Know About You?  Strata London 2016
What Does Your Smart Car Know About You? Strata London 2016
 
Cloud Spin - building a photo booth with the Google Cloud Platform
Cloud Spin - building a photo booth with the Google Cloud PlatformCloud Spin - building a photo booth with the Google Cloud Platform
Cloud Spin - building a photo booth with the Google Cloud Platform
 
OSCON 2019 "Break me if you can: practical guide to building fault-tolerant s...
OSCON 2019 "Break me if you can: practical guide to building fault-tolerant s...OSCON 2019 "Break me if you can: practical guide to building fault-tolerant s...
OSCON 2019 "Break me if you can: practical guide to building fault-tolerant s...
 
HTML5 for mobile development
HTML5 for mobile developmentHTML5 for mobile development
HTML5 for mobile development
 
[BreizhCamp, format 15min] Construire et automatiser l'ecosystème de son Saa...
[BreizhCamp, format 15min] Construire et automatiser l'ecosystème de son Saa...[BreizhCamp, format 15min] Construire et automatiser l'ecosystème de son Saa...
[BreizhCamp, format 15min] Construire et automatiser l'ecosystème de son Saa...
 
Redmine - a project management system
Redmine - a project management systemRedmine - a project management system
Redmine - a project management system
 
Clean code on Android (Droidcon Dubai 2015)
Clean code on Android (Droidcon Dubai 2015)Clean code on Android (Droidcon Dubai 2015)
Clean code on Android (Droidcon Dubai 2015)
 
Break me if you can: practical guide to building fault-tolerant systems (with...
Break me if you can: practical guide to building fault-tolerant systems (with...Break me if you can: practical guide to building fault-tolerant systems (with...
Break me if you can: practical guide to building fault-tolerant systems (with...
 
An AP(EYE) Toward the Revolution
An AP(EYE) Toward the RevolutionAn AP(EYE) Toward the Revolution
An AP(EYE) Toward the Revolution
 
Jason Barnard — Structured Data for the Knowledge Panel
Jason Barnard — Structured Data for the Knowledge PanelJason Barnard — Structured Data for the Knowledge Panel
Jason Barnard — Structured Data for the Knowledge Panel
 
Use Groovy&Grails in your spring boot projects
Use Groovy&Grails in your spring boot projectsUse Groovy&Grails in your spring boot projects
Use Groovy&Grails in your spring boot projects
 
Introducing Mulberry
Introducing MulberryIntroducing Mulberry
Introducing Mulberry
 
Latinoware Rails 2009
Latinoware Rails 2009Latinoware Rails 2009
Latinoware Rails 2009
 
Fun with ruby and redis, arrrrcamp edition, javier_ramirez, teowaki
Fun with ruby and redis, arrrrcamp edition, javier_ramirez, teowakiFun with ruby and redis, arrrrcamp edition, javier_ramirez, teowaki
Fun with ruby and redis, arrrrcamp edition, javier_ramirez, teowaki
 

More from Carl Brown

Cocoa coders 141113-watch
Cocoa coders 141113-watchCocoa coders 141113-watch
Cocoa coders 141113-watch
Carl Brown
 

More from Carl Brown (20)

GDPR, User Data, Privacy, and Your Apps
GDPR, User Data, Privacy, and Your AppsGDPR, User Data, Privacy, and Your Apps
GDPR, User Data, Privacy, and Your Apps
 
New in iOS 11.3b4 and Xcode 9.3b4
New in iOS 11.3b4 and Xcode 9.3b4New in iOS 11.3b4 and Xcode 9.3b4
New in iOS 11.3b4 and Xcode 9.3b4
 
Managing Memory in Swift (Yes, that's a thing)
Managing Memory in Swift (Yes, that's a thing)Managing Memory in Swift (Yes, that's a thing)
Managing Memory in Swift (Yes, that's a thing)
 
Better Swift from the Foundation up #tryswiftnyc17 09-06
Better Swift from the Foundation up #tryswiftnyc17 09-06Better Swift from the Foundation up #tryswiftnyc17 09-06
Better Swift from the Foundation up #tryswiftnyc17 09-06
 
Generics, the Swift ABI and you
Generics, the Swift ABI and youGenerics, the Swift ABI and you
Generics, the Swift ABI and you
 
Swift GUI Development without Xcode
Swift GUI Development without XcodeSwift GUI Development without Xcode
Swift GUI Development without Xcode
 
what's new in iOS10 2016-06-23
what's new in iOS10 2016-06-23what's new in iOS10 2016-06-23
what's new in iOS10 2016-06-23
 
Open Source Swift: Up and Running
Open Source Swift: Up and RunningOpen Source Swift: Up and Running
Open Source Swift: Up and Running
 
Parse migration CocoaCoders April 28th, 2016
Parse migration CocoaCoders April 28th, 2016Parse migration CocoaCoders April 28th, 2016
Parse migration CocoaCoders April 28th, 2016
 
Swift 2.2 Design Patterns CocoaConf Austin 2016
Swift 2.2 Design Patterns CocoaConf Austin 2016Swift 2.2 Design Patterns CocoaConf Austin 2016
Swift 2.2 Design Patterns CocoaConf Austin 2016
 
Advanced, Composable Collection Views, From CocoaCoders meetup Austin Feb 12,...
Advanced, Composable Collection Views, From CocoaCoders meetup Austin Feb 12,...Advanced, Composable Collection Views, From CocoaCoders meetup Austin Feb 12,...
Advanced, Composable Collection Views, From CocoaCoders meetup Austin Feb 12,...
 
Gcd cc-150205
Gcd cc-150205Gcd cc-150205
Gcd cc-150205
 
Cocoa coders 141113-watch
Cocoa coders 141113-watchCocoa coders 141113-watch
Cocoa coders 141113-watch
 
iOS8 and the new App Store
iOS8 and the new App Store   iOS8 and the new App Store
iOS8 and the new App Store
 
Dark Art of Software Estimation 360iDev2014
Dark Art of Software Estimation 360iDev2014Dark Art of Software Estimation 360iDev2014
Dark Art of Software Estimation 360iDev2014
 
Intro to cloud kit Cocoader.org 24 July 2014
Intro to cloud kit   Cocoader.org 24 July 2014Intro to cloud kit   Cocoader.org 24 July 2014
Intro to cloud kit Cocoader.org 24 July 2014
 
Welcome to Swift (CocoaCoder 6/12/14)
Welcome to Swift (CocoaCoder 6/12/14)Welcome to Swift (CocoaCoder 6/12/14)
Welcome to Swift (CocoaCoder 6/12/14)
 
Introduction to Git Commands and Concepts
Introduction to Git Commands and ConceptsIntroduction to Git Commands and Concepts
Introduction to Git Commands and Concepts
 
REST/JSON/CoreData Example Code - A Tour
REST/JSON/CoreData Example Code - A TourREST/JSON/CoreData Example Code - A Tour
REST/JSON/CoreData Example Code - A Tour
 
360iDev iOS AntiPatterns
360iDev iOS AntiPatterns360iDev iOS AntiPatterns
360iDev iOS AntiPatterns
 

Recently uploaded

Recently uploaded (20)

DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
Emergent Methods: Multi-lingual narrative tracking in the news - real-time ex...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 

Writing Apps that Can See: Getting Data from CoreImage to Computer Vision - 360iDev 2013 Presentation

Editor's Notes

  1. But computer vision can be done in software and to make very interesting apps.
  2. Who here wants to get a Ph.D. in Computer Vision? How many of you think you can get one in an hour?