Patternrecogandroid Color

download Patternrecogandroid Color

of 16

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