40
©SIProp Project, 2006-2008 1 How to Make Hand Detector on Native Activity with OpenCV Noritsuna Imamura [email protected]

How to Make Hand Detector on Native Activity with OpenCV

Embed Size (px)

DESCRIPTION

Preparing Benchmark How to Load Files on NativeActivity How to Make Hand Detector Calculate Histgram of Skin Color Detect Skin Area from CapImage Calculate the Largest Skin Area Matching Histgrams

Citation preview

©SIProp Project, 2006-2008 1

How to Make Hand Detector on Native Activity with OpenCV

Noritsuna Imamura

[email protected]

©SIProp Project, 2006-2008 2

Agenda

Preparing

Benchmark

How to Load Files on NativeActivity

How to Make Hand Detector

Calculate Histgram of Skin Color

Detect Skin Area from CapImage

Calculate the Largest Skin Area

Matching Histgrams

©SIProp Project, 2006-2008 3

Hand Detector

©SIProp Project, 2006-2008 4

Chart of Hand Detector

Calc Histgram of Skin Color

Detect Skin Area from CapImage

Calc the Largest Skin Area

Matching Histgrams

©SIProp Project, 2006-2008 5

Chart of Hand Detector

Calc Histgram of Skin Color

Detect Skin Area from CapImage

Calc the Largest Skin Area

Matching Histgrams

Histgram

Convex Hull

Labeling

Feature Point Distance

©SIProp Project, 2006-2008 6

Mat vs IplImageBenchmark

©SIProp Project, 2006-2008 7

About Mat & IplImage

cv::Mat

Version 2.x and Upper

Written by C++

AdvantageEasy to Use

Faster

IplImage

Version 1.x and Upper

Written by C

AdvantageMany Documents

1. IplImage* img;2. for(int h = 0; h < img->height; h++) {3. for(int w = 0; w < img->width; w++){4. img->imageData[img-

>widthStep * h + w * 3 + 0]=0;//B5. img->imageData[img-

>widthStep * h + w * 3 + 1]=0;//G6. img->imageData[img-

>widthStep * h + w * 3 + 2]=0;//R7. }8. }

1. cv::Mat_<cv::Vec3b> img;2. for (int r = 0; r < img.rows; r++ ) {3. for(int c = 0; c < img.cols; c++ ) {4. cv::Vec3b &v =

img.at<cv::Vec3b>(r,c);5. v[0] = 0;//B6. v[1] = 0;//G7. v[2] = 0;//R8. }9. }

©SIProp Project, 2006-2008 8

Benchmark on Android

Gray Scale

Download Here:http://github.com/noritsuna/MatIplBenchmark

©SIProp Project, 2006-2008 9

How to Load File on NativeActivity

©SIProp Project, 2006-2008 10

AssetManager

“assets” dir is your resource file dir on Android

“res”(resource) dir is also same. But the file that is there is made “Resource ID” by R file.

Ex. I18n

How to Use

NDK with JavaAAssetManager Class (C++)

NativeActivityAssetManager4NativeActivity by me

http://github.com/noritsuna/AssetManager4NativeActivity

©SIProp Project, 2006-2008 11

AssetManager4NativeActivity

Android.mk

Copy header File & static lib

assetmanager.h

libassetmanager.a

1. include $(CLEAR_VARS)2. LOCAL_MODULE:=assetmanager3. LOCAL_SRC_FILES:=../AssetManager4NativeActivity/li

bassetmanager.a4. include $(PREBUILT_STATIC_LIBRARY)

5. LOCAL_STATIC_LIBRARIES += assetmanager

©SIProp Project, 2006-2008 12

AssetManager4NativeActivity

assetmanager.h

int setupAsset(const char *package_name);Copy "assets" directory from APK file to under "/data/data/[Package Name]" directory.

int loadAseetFile(const char *package_name, constchar *load_file_name);

Copy File of "load_file_name" from APK file to under "/data/data/[Package Name]/assets" directory.

1. createAssetFile("assets/images/skincolorsample.jpg");2. sprintf(file_path, "%s/%s/%s", “/data/data”,

PACKAGE_NAME, "assets/images/skincolorsample.jpg");

3. skin_color_sample = cvLoadImage(file_path);

©SIProp Project, 2006-2008 13

How to Make Hand Detector

©SIProp Project, 2006-2008 14

Sample Source Code:

http://github.com/noritsuna/HandDetector

Hand Detector

©SIProp Project, 2006-2008 15

Chart of Hand Detector

Calc Histgram of Skin Color

Detect Skin Area from CapImage

Calc the Largest Skin Area

Matching Histgrams

©SIProp Project, 2006-2008 16

Chart of Hand Detector

Calc Histgram of Skin Color

Detect Skin Area from CapImage

Calc the Largest Skin Area

Matching Histgrams

Histgram

Convex Hull

Labeling

Feature Point Distance

©SIProp Project, 2006-2008 17

Calculate Histgram of Skin Color

©SIProp Project, 2006-2008 18

What’s Histgram?

Frequency Distribution Chart.

Why Use it?

For Checking Skin Color.Each people’s Skin Color

is NOT same.

One of Leveling algorithm.

©SIProp Project, 2006-2008 19

Step 1/2

Convert RGB to HSV

RGB color is changed by Light Color.Hue

Saturation/Chroma

Value/Lightness/Brightness

1. cvCvtColor( src, hsv, CV_BGR2HSV );

2. IplImage* h_plane = cvCreateImage( size, IPL_DEPTH_8U, 1 );

3. IplImage* s_plane = cvCreateImage( size, IPL_DEPTH_8U, 1 );

4. IplImage* v_plane = cvCreateImage( size, IPL_DEPTH_8U, 1 );

©SIProp Project, 2006-2008 20

Step 2/2

cvCreateHist();

PrameterDimension of Histgram

Size

Type

Range of limit

Over limit Use or Not

1. IplImage* planes[] = { h_plane, s_plane };2. *hist = cvCreateHist(2,3. hist_size,4. CV_HIST_ARRAY,5. ranges,6. 1);7. cvCalcHist( planes, *hist, 0, 0 );8. cvMinMaxLoc(v_plane, vmin, vmax);

©SIProp Project, 2006-2008 21

Detect Skin Area from CapImage

©SIProp Project, 2006-2008 22

How to Get Skin Area?

Use “Convex Hull” algorithm

1. Check Image From Left-Top.

2. Found Black Color Pixel is Start Point.

3. Search Black Pixel by Right Image.

4. Go to Black Pixel that First Found, this is next point.

5. Do 2-4 again, if back to Start Point, get Convex Hull.

※Convert to Black-White Image

Image Source: http://homepage2.nifty.com/tsugu/sotuken/ronbun/sec3-2.html#0013

©SIProp Project, 2006-2008 23

Step 1/3

Delete V(Lightness/Brightness) Color

1. Calculate Back Project Image by Skin Color Histgram.

2. Threshold by V(Lightness/Brightness) Color.

3. And Operation between Mask and Back Project.

4. Threshold to Back Project. (Adjustment)

1. cvCalcBackProject(planes, backProjectImage, hist);

2. cvThreshold(v_plane, maskImage, *v_min, *v_max, CV_THRESH_BINARY);

3. cvAnd(backProjectImage, maskImage, backProjectImage);

4. cvThreshold(backProjectImage, dstImage, 10, 255, CV_THRESH_BINARY);

©SIProp Project, 2006-2008 24

Step 2/3

Noise Reduction

1. Erode (scale-down)

2. Dilate (scale-up)

1. cvErode(dstImage, dstImage, NULL, 1);2. cvDilate(dstImage, dstImage, NULL, 1);

1/4

©SIProp Project, 2006-2008 25

Step 3/3

Convex Hull

cvFindContours();Source Image

Convex that is detected

First Convex Pointer that detected

1. cvFindContours(dstImage, storage, &contours);

©SIProp Project, 2006-2008 26

Calculate the Largest Skin Area

©SIProp Project, 2006-2008 27

What’s Labeling?

Labeling

Area Marking Algorithm.4-Connection

8-Connection

Image Source: http://imagingsolution.blog107.fc2.com/blog-entry-193.html

©SIProp Project, 2006-2008 28

Labeling Algorithm 1/4

1, Scan Image by Raster

2, If you got a White Pixel,

1, Check Right Image Pixels

2, All “0”, Put the Latest Number + 1 in Pixel

©SIProp Project, 2006-2008 29

Labeling Algorithm 2/4

1, If you got a White Pixel,

1, Check Right Image Orange Pixels

2, Not “0”,

The Lowest Orange Pixels Number in Pixel

©SIProp Project, 2006-2008 30

Labeling Algorithm 3/4

1, If got 2 more Number in Orange Pixeles,

1, Put The Lowest Number in Pixel,

Change Other Numbers’ “Look up table”

to The Lowest Number.

©SIProp Project, 2006-2008 31

Labeling Algorithm 4/4

1, After finish, Check “Look up Table”.

1, If Dst is NOT Serial Number,

Change to Serial Number

2, Src is changed Dst Number.

©SIProp Project, 2006-2008 32

Get Area Size

cvContourArea();

1. for (CvSeq* c= contours; c != NULL; c = c->h_next){2. double area = abs(cvContourArea(c,

CV_WHOLE_SEQ));3. if (maxArea < area) {4. maxArea = area;5. hand_ptr = c;6. }7. }

©SIProp Project, 2006-2008 33

Matching Histgrams

©SIProp Project, 2006-2008 34

Matching Histgrams

Histgram of Oriented Gradients (HoG)

Split Some Area, And Calc Histgram of each Area.

©SIProp Project, 2006-2008 35

Why Use HoG?

Matching Hand Shape.

Use Feature Point Distance with Each HoG.

©SIProp Project, 2006-2008 36

Step 1/3

Calculate each Cell (Block(3x3) with Edge Pixel(5x5))

luminance gradient moment

luminance gradient degree=deg

1. for(int y=0; y<height; y++){2. for(int x=0; x<width; x++){3. if(x==0 || y==0 || x==width-1 || y==height-1){4. continue;5. }6. double dx = img->imageData[y*img-

>widthStep+(x+1)] - img->imageData[y*img->widthStep+(x-1)];7. double dy = img->imageData[(y+1)*img-

>widthStep+x] - img->imageData[(y-1)*img->widthStep+x];8. double m = sqrt(dx*dx+dy*dy);9. double deg = (atan2(dy, dx)+CV_PI) * 180.0 / CV_PI;10. int bin = CELL_BIN * deg/360.0;11. if(bin < 0) bin=0;12. if(bin >= CELL_BIN) bin = CELL_BIN-1;13. hist[(int)(x/CELL_X)][(int)(y/CELL_Y)][bin] += m;14. }15. }

©SIProp Project, 2006-2008 37

Step 2/3

Calculate Feature Vector of Each Block(Go to Next Page)

1. for(int y=0; y<BLOCK_HEIGHT; y++){2. for(int x=0; x<BLOCK_WIDTH; x++){

3. //Calculate Feature Vector in Block4. double vec[BLOCK_DIM];5. memset(vec, 0, BLOCK_DIM*sizeof(double));6. for(int j=0; j<BLOCK_Y; j++){7. for(int i=0; i<BLOCK_X; i++){8. for(int d=0; d<CELL_BIN; d++){9. int index =

j*(BLOCK_X*CELL_BIN) + i*CELL_BIN + d;10. vec[index] =

hist[x+i][y+j][d];11. }12. }13. }

©SIProp Project, 2006-2008 38

Step 3/3

(Continued)

Normalize Vector

Set Feature Vector

1. //Normalization of Vector2. double norm = 0.0;3. for(int i=0; i<BLOCK_DIM; i++){4. norm += vec[i]*vec[i];5. }6. for(int i=0; i<BLOCK_DIM; i++){7. vec[i] /= sqrt(norm + 1.0);8. }

9. //Put feat10. for(int i=0; i<BLOCK_DIM; i++){11. int index = y*BLOCK_WIDTH*BLOCK_DIM

+ x*BLOCK_DIM + i;12. feat[index] = vec[i];13. }14. }15. }

©SIProp Project, 2006-2008 39

How to Calc Approximation

Calc HoG Distance of each block

Get Average.

©SIProp Project, 2006-2008 40

Step 1/1

Calulate Feature Point Distance

1. double dist = 0.0;2. for(int i = 0; i < TOTAL_DIM; i++){3. dist += fabs(feat1[i] - feat2[i])*fabs(feat1[i]

- feat2[i]);4. }5. return sqrt(dist);