SlideShare une entreprise Scribd logo
1  sur  117
Télécharger pour lire hors ligne
#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

Contenu connexe

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

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...Alex Borysov
 
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 2016Charles Givre
 
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...Alex Borysov
 
HTML5 for mobile development
HTML5 for mobile developmentHTML5 for mobile development
HTML5 for mobile developmentCarlos Justiniano
 
[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...François-Guillaume Ribreau
 
Redmine - a project management system
Redmine - a project management systemRedmine - a project management system
Redmine - a project management systemCaesar Chi
 
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)Danny Preussler
 
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...Alex Borysov
 
An AP(EYE) Toward the Revolution
An AP(EYE) Toward the RevolutionAn AP(EYE) Toward the Revolution
An AP(EYE) Toward the RevolutionZencoder
 
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 PanelSemrush
 
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 projectsParadigma Digital
 
Latinoware Rails 2009
Latinoware Rails 2009Latinoware Rails 2009
Latinoware Rails 2009Fabio Akita
 
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, teowakijavier ramirez
 

Similaire à 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
 

Plus de Carl Brown

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 AppsCarl Brown
 
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.3b4Carl Brown
 
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)Carl Brown
 
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-06Carl Brown
 
Generics, the Swift ABI and you
Generics, the Swift ABI and youGenerics, the Swift ABI and you
Generics, the Swift ABI and youCarl Brown
 
Swift GUI Development without Xcode
Swift GUI Development without XcodeSwift GUI Development without Xcode
Swift GUI Development without XcodeCarl Brown
 
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-23Carl Brown
 
Open Source Swift: Up and Running
Open Source Swift: Up and RunningOpen Source Swift: Up and Running
Open Source Swift: Up and RunningCarl Brown
 
Parse migration CocoaCoders April 28th, 2016
Parse migration CocoaCoders April 28th, 2016Parse migration CocoaCoders April 28th, 2016
Parse migration CocoaCoders April 28th, 2016Carl Brown
 
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 2016Carl Brown
 
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,...Carl Brown
 
Cocoa coders 141113-watch
Cocoa coders 141113-watchCocoa coders 141113-watch
Cocoa coders 141113-watchCarl Brown
 
iOS8 and the new App Store
iOS8 and the new App Store   iOS8 and the new App Store
iOS8 and the new App Store Carl Brown
 
Dark Art of Software Estimation 360iDev2014
Dark Art of Software Estimation 360iDev2014Dark Art of Software Estimation 360iDev2014
Dark Art of Software Estimation 360iDev2014Carl Brown
 
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 2014Carl Brown
 
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)Carl Brown
 
Introduction to Git Commands and Concepts
Introduction to Git Commands and ConceptsIntroduction to Git Commands and Concepts
Introduction to Git Commands and ConceptsCarl Brown
 
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 TourCarl Brown
 
360iDev iOS AntiPatterns
360iDev iOS AntiPatterns360iDev iOS AntiPatterns
360iDev iOS AntiPatternsCarl Brown
 

Plus de 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
 

Dernier

MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfOverkill Security
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Orbitshub
 
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 educationjfdjdjcjdnsjd
 
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...Zilliz
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...Martijn de Jong
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdfSandro Moreira
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Victor Rentea
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodJuan lago vázquez
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesrafiqahmad00786416
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKJago de Vreede
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...apidays
 
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.pptxRustici Software
 
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 DiscoveryTrustArc
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 

Dernier (20)

MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Cyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdfCyberprint. Dark Pink Apt Group [EN].pdf
Cyberprint. Dark Pink Apt Group [EN].pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
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
 
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...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
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
 
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
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 

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

Notes de l'éditeur

  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?