Patternrecogandroid Color
-
Upload
alberto-islas -
Category
Documents
-
view
216 -
download
0
Transcript of Patternrecogandroid Color
-
7/28/2019 Patternrecogandroid Color
1/16
Reconocimiento de patronesen Android con OpenCV
Rubn Serrano
-
7/28/2019 Patternrecogandroid Color
2/16
1.Introduccin
2.Herramientas de desarrollo
3.Proyecto
1.Cdigo Android SDK
2.Cdigo Android NDK
3.Cdigo OpenCV
-
7/28/2019 Patternrecogandroid Color
3/16
Introduccin
Formas de trabajar con OpenCV
Java API
Libreras nativas (C/C++)
-
7/28/2019 Patternrecogandroid Color
4/16
Herramientas...
... que vamos a utilizar hoy
Eclipse
http://www.eclipse.org/downloads/
Android SDKhttp://developer.android.com/sdk/index.html
Android NDK
http://developer.android.com/sdk/ndk/index.html
OpenCV
http://opencv.willowgarage.com/wiki/InstallGuide
http://www.eclipse.org/downloads/http://developer.android.com/sdk/index.htmlhttp://developer.android.com/sdk/ndk/index.htmlhttp://opencv.willowgarage.com/wiki/InstallGuide%20http://opencv.willowgarage.com/wiki/InstallGuide%20http://developer.android.com/sdk/ndk/index.htmlhttp://developer.android.com/sdk/index.htmlhttp://www.eclipse.org/downloads/ -
7/28/2019 Patternrecogandroid Color
5/16
Herramientas
Compilacin de OpenCV para Android Linux i Windows
http://opencv.willowgarage.com/wiki/AndroidTrunk
el Unix de la manzana El enlace anterior, y
whichlight.com/blog
http://opencv.willowgarage.com/wiki/AndroidTrunkhttp://whichlight.com/blog/computer-vision-on-the-android-getting-started-with-opencv-android/http://whichlight.com/blog/computer-vision-on-the-android-getting-started-with-opencv-android/http://opencv.willowgarage.com/wiki/AndroidTrunk -
7/28/2019 Patternrecogandroid Color
6/16
Proyecto
App en el Android Market Buscar: Demo Reconocimiento Patrones
https://market.android.com/details?id=org.cvc.gtugbcn.patrec
Proyecto base para Eclipse
http://deic.uab.cat/~rserrano/android/proyecto.tar.gz
Estas transparencias
http://deic.uab.cat/~rserrano/android/patternrecog.pdf
https://market.android.com/details?id=org.cvc.gtugbcn.patrechttp://deic.uab.cat/~rserrano/android/proyecto.tar.gzhttp://deic.uab.cat/~rserrano/android/patternrecog.pdfhttp://deic.uab.cat/~rserrano/android/patternrecog.pdfhttp://deic.uab.cat/~rserrano/android/proyecto.tar.gzhttps://market.android.com/details?id=org.cvc.gtugbcn.patrec -
7/28/2019 Patternrecogandroid Color
7/16
Cdigo Android SDK
Aadir llamadas a cdigo nativo En la clase SampleView
En processFrame, en el switch
case MainActivity.PATTERN_RECORD:mProcessor = ObtainPattern(getFrameWidth(), getFrameHeight(), data, rgba);MainActivity.mProcessMode = MainActivity.VIDEO_MODE;break;
case MainActivity.INSPECTION_MODE:FindPattern(mProcessor, getFrameWidth(), getFrameHeight(), data, rgba);break;
publicnativelong ObtainPattern(int width, int height, byte yuv[], int[] rgba);publicnativevoid FindPattern(long processor, int width, int height, byte yuv[], int[] rgba);static{
System.loadLibrary("pattern_recognition");}
-
7/28/2019 Patternrecogandroid Color
8/16
Cdigo JNI / OpenCV
Mtodo ObtainPattern jbyte* _yuv = env->GetByteArrayElements(yuv,0);
jint* _bgra = env->GetIntArrayElements(bgra,0);
Mat matGray(height, width, CV_8UC1, (unsignedchar*)_yuv);
Mat myuv(height + height/2, width, CV_8UC1, (unsignedchar*)_yuv);
Mat mbgra(height, width, CV_8UC4, (unsignedchar*)_bgra);
Processor* processor = new Processor();
processor->obtainPattern(matGray);
drawText(mbgra, "Patron adquirido");
return (long)processor;
env->ReleaseIntArrayElements(bgra, _bgra,0);
env->ReleaseByteArrayElements(yuv, _yuv, 0);
-
7/28/2019 Patternrecogandroid Color
9/16
Cdigo OpenCV (Patrn)
Constructor de Processor
Funcin obtainPattern()
storage = cvCreateMemStorage(0);
params = cvSURFParams(500, 1);
objectKeypoints = 0;
objectDescriptors = 0;
cvExtractSURF( &(static_cast(imgMat)),0, &objectKeypoints, &objectDescriptors, storage, params );
-
7/28/2019 Patternrecogandroid Color
10/16
Cdigo JNI / OpenCV
Mtodo FindPatternjbyte* _yuv = env->GetByteArrayElements(yuv, 0);
jint* _bgra = env->GetIntArrayElements(bgra,0);
Mat matGray(height, width, CV_8UC1, (unsignedchar*)_yuv);
Mat myuv(height + height/2, width, CV_8UC1, (unsignedchar*)_yuv);
Mat mbgra(height, width, CV_8UC4, (unsignedchar*)_bgra);
//Please make attention about BGRA byte order
//ARGB stored in java as int array becomes BGRA at native level
cvtColor(myuv, mbgra, CV_YUV420sp2BGR, 4);
Processor* processor = (Processor*) pProcessor;
processor->detectAndDrawFeatures(mbgra, matGray);
env->ReleaseIntArrayElements(bgra, _bgra,0);
env->ReleaseByteArrayElements(yuv, _yuv,0);
-
7/28/2019 Patternrecogandroid Color
11/16
Cdigo OpenCV
Funcin detectAndDrawFeatures() IplImage img = greyMat;
int i;
imageKeypoints = 0;
imageDescriptors = 0;
cvExtractSURF( &img, 0, &imageKeypoints, &imageDescriptors, storage, params );
CvPoint src_corners[4] = {{0,0}, {img.width,0}, {img.width, img.height}, {0, img.height}};CvPoint dst_corners[4];
if( locatePlanarObject( objectKeypoints, objectDescriptors, imageKeypoints, imageDescriptors, src_corners, dst_corners ))
{
for( i = 0; i < 4; i++ )
{
CvPoint r1 = dst_corners[i%4];
CvPoint r2 = dst_corners[(i+1)%4];
line(imgMat, cvPoint(r1.x, r1.y), cvPoint(r2.x, r2.y), CV_RGB(0, 0, 0), 6, CV_AA);
}
drawText(imgMat, "Found ya!");
}
-
7/28/2019 Patternrecogandroid Color
12/16
Cdigo OpenCV Funcin locatePlanarObject()
double h[9];
CvMat _h = cvMat(3, 3, CV_64F, h);
vector ptpairs;
vector pt1, pt2;
CvMat _pt1, _pt2;
int i, n;
flannFindPairs(objectDescriptors, imageDescriptors, ptpairs );
n = (int)(ptpairs.size()/2);
if( n < 4 )
return0;
pt1.resize(n);
pt2.resize(n);
for( i = 0; i < n; i++ ){
pt1[i] = ((CvSURFPoint*)cvGetSeqElem(objectKeypoints,ptpairs[i*2]))->pt;
pt2[i] = ((CvSURFPoint*)cvGetSeqElem(imageKeypoints,ptpairs[i*2+1]))->pt;
}
-
7/28/2019 Patternrecogandroid Color
13/16
-
7/28/2019 Patternrecogandroid Color
14/16
Cdigo OpenCV Funcin flannFindPairs()
int length = (int)(objectDescriptors->elem_size/sizeof(float));
Mat m_object(objectDescriptors->total, length, CV_32F);
Mat m_image(imageDescriptors->total, length, CV_32F);
// copy descriptors
CvSeqReader obj_reader;
float* obj_ptr = m_object.ptr(0);
cvStartReadSeq( objectDescriptors, &obj_reader );
for(int i = 0; i < objectDescriptors->total; i++ ){
constfloat* descriptor = (constfloat*)obj_reader.ptr;
CV_NEXT_SEQ_ELEM( obj_reader.seq->elem_size, obj_reader );
memcpy(obj_ptr, descriptor, length*sizeof(float));
obj_ptr += length;
}
CvSeqReader img_reader;float* img_ptr = m_image.ptr(0);
cvStartReadSeq( imageDescriptors, &img_reader );
for(int i = 0; i < imageDescriptors->total; i++ )
{
constfloat* descriptor = (constfloat*)img_reader.ptr;
CV_NEXT_SEQ_ELEM( img_reader.seq->elem_size, img_reader );
memcpy(img_ptr, descriptor, length*sizeof(float));
img_ptr += length;}
-
7/28/2019 Patternrecogandroid Color
15/16
Cdigo OpenCV
// find nearest neighbors using FLANN
Mat m_indices(objectDescriptors->total,2, CV_32S);
Mat m_dists(objectDescriptors->total, 2, CV_32F);
flann::Index flann_index(m_image, flann::KDTreeIndexParams(4)); // using 4 randomized kdtrees
flann_index.knnSearch(m_object, m_indices, m_dists,2, flann::SearchParams(64) ); // maximum number of leafs checked
int* indices_ptr = m_indices.ptr(0);
float* dists_ptr = m_dists.ptr(0);
for(int i=0;i
-
7/28/2019 Patternrecogandroid Color
16/16