小清新wordpress主题/南宁seo公司
android 本身再external中是有一个opencv的库的,android7之后多了一个opencv3,不过我们的系统是基于android6的,所以只有opencv1.1,查了一下用法,发现opencv1.1 和opencv2的使用基本上是完全兼容的
两个的源码分别在:
- opencv1.1
- opencv2~3
用的时候发现我用png,然后cvloadImage没load成功,找了许久吧 libpng加了进来,发现libpng的版本比较新,需要在opencv中引用libz。
最后对opencv的Android.mk
和grfmt_png.cpp
做了修改,修改如下:
external/opencv/Android.mk
diff --git a/external/opencv/Android.mk b/external/opencv/Android.mk
index 5fe3a68..cc8364e 100644
--- a/external/opencv/Android.mk
+++ b/external/opencv/Android.mk
@@ -231,11 +231,15 @@ LOCAL_C_INCLUDES := \$(LOCAL_PATH)/cv/include \$(LOCAL_PATH)/cxcore/include \$(LOCAL_PATH)/otherlibs/highgui \
- external/jpeg
+ external/jpeg \
+ external/libpng \
+ external/zlib-LOCAL_SHARED_LIBRARIES += libjpeg
+LOCAL_SHARED_LIBRARIES += libjpeg \
+ libpng \
+ libz-LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%) -DHAVE_JPEG
+LOCAL_CFLAGS := $(LOCAL_C_INCLUDES:%=-I%) -DHAVE_JPEG -DHAVE_PNG -DHAVE_PNG_H# grfmt_tiff.cpp has implicit cast of int struct fields.LOCAL_CLANG_CFLAGS += -Wno-c++11-narrowing
diff --git a/external/opencv/otherlibs/highgui/grfmt_png.cpp b/external/opencv/otherlibs/highgui/grfmt_png.cpp
index b116ada..69c4a64 100644
--- a/external/opencv/otherlibs/highgui/grfmt_png.cpp
+++ b/external/opencv/otherlibs/highgui/grfmt_png.cpp
@@ -52,6 +52,7 @@#if defined WIN32 || defined HAVE_PNG_H#include <png.h>
+#include <zlib.h>#else#include <libpng/png.h>#endif
@@ -143,7 +144,7 @@ bool GrFmtPngReader::ReadHeader()if( info_ptr && end_info ){
- if( setjmp( png_ptr->jmpbuf ) == 0 )
+ if( setjmp( png_jmpbuf(png_ptr) ) == 0 ){m_f = fopen( m_filename, "rb" );if( m_f )
@@ -192,7 +193,7 @@ bool GrFmtPngReader::ReadData( uchar* data, int step, int color )png_infop info_ptr = (png_infop)m_info_ptr;png_infop end_info = (png_infop)m_end_info;- if( setjmp(png_ptr->jmpbuf) == 0 )
+ if( setjmp( png_jmpbuf(png_ptr) ) == 0 ){int y;@@ -215,7 +216,7 @@ bool GrFmtPngReader::ReadData( uchar* data, int step, int color )png_set_palette_to_rgb( png_ptr );if( m_color_type == PNG_COLOR_TYPE_GRAY && m_bit_depth < 8 )
- png_set_gray_1_2_4_to_8( png_ptr );
+ png_set_expand_gray_1_2_4_to_8( png_ptr );if( m_iscolor && color )png_set_bgr( png_ptr ); // convert RGB to BGR
@@ -282,7 +283,7 @@ bool GrFmtPngWriter::WriteImage( const uchar* data, int step,if( info_ptr ){
- if( setjmp( png_ptr->jmpbuf ) == 0 )
+ if( setjmp( png_jmpbuf(png_ptr) ) == 0 ){f = fopen( m_filename, "wb" );
弄完之后重新编译
mmm external/libpng
mmm external/libz
mmm external/opencv
在我写的小程序里面,mk是这样写的
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= cv
LOCAL_SRC_FILES:= \cv.cppLOCAL_C_INCLUDES := \external/opencv/cv/include \external/opencv/cxcore/include \external/opencv/cvaux/include \external/opencv/ml/include \external/opencv/otherlibs/highgui \external/libpng \external/zlibLOCAL_STATIC_LIBRARIES := \libopencv \libcvhighgui \libcxcore \libcv \libcvaux \libcvmlLOCAL_SHARED_LIBRARIES := \libjpeg \libpng \libzLOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS += -Wall -Werror
include $(BUILD_EXECUTABLE)
cpp部分的代码很简单的,就是把opencv sample中的find_object修改了一下,参考
https://github.com/archith/opencv_1.1/blob/master/opencv-1.1.0/samples/c/find_obj.cpp
/** A Demo to OpenCV Implementation of SURF* Further Information Refer to "SURF: Speed-Up Robust Feature"* Author: Liu Liu* liuliu.1987+opencv@gmail.com*/#include <cv.h>
#include <highgui.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>#include <iostream>
#include <vector>using namespace std;IplImage *image = 0;double
compareSURFDescriptors( const float* d1, const float* d2, double best, int length )
{double total_cost = 0;assert( length % 4 == 0 );for( int i = 0; i < length; i += 4 ){double t0 = d1[i] - d2[i];double t1 = d1[i+1] - d2[i+1];double t2 = d1[i+2] - d2[i+2];double t3 = d1[i+3] - d2[i+3];total_cost += t0*t0 + t1*t1 + t2*t2 + t3*t3;if( total_cost > best )break;}return total_cost;
}int
naiveNearestNeighbor( const float* vec, int laplacian,const CvSeq* model_keypoints,const CvSeq* model_descriptors )
{int length = (int)(model_descriptors->elem_size/sizeof(float));int i, neighbor = -1;double d, dist1 = 1e6, dist2 = 1e6;CvSeqReader reader, kreader;cvStartReadSeq( model_keypoints, &kreader, 0 );cvStartReadSeq( model_descriptors, &reader, 0 );for( i = 0; i < model_descriptors->total; i++ ){const CvSURFPoint* kp = (const CvSURFPoint*)kreader.ptr;const float* mvec = (const float*)reader.ptr;CV_NEXT_SEQ_ELEM( kreader.seq->elem_size, kreader );CV_NEXT_SEQ_ELEM( reader.seq->elem_size, reader );if( laplacian != kp->laplacian )continue;d = compareSURFDescriptors( vec, mvec, dist2, length );if( d < dist1 ){dist2 = dist1;dist1 = d;neighbor = i;}else if ( d < dist2 )dist2 = d;}if ( dist1 < 0.6*dist2 )return neighbor;return -1;
}void
findPairs( const CvSeq* objectKeypoints, const CvSeq* objectDescriptors,const CvSeq* imageKeypoints, const CvSeq* imageDescriptors, vector<int>& ptpairs )
{int i;CvSeqReader reader, kreader;cvStartReadSeq( objectKeypoints, &kreader );cvStartReadSeq( objectDescriptors, &reader );ptpairs.clear();for( i = 0; i < objectDescriptors->total; i++ ){const CvSURFPoint* kp = (const CvSURFPoint*)kreader.ptr;const float* descriptor = (const float*)reader.ptr;CV_NEXT_SEQ_ELEM( kreader.seq->elem_size, kreader );CV_NEXT_SEQ_ELEM( reader.seq->elem_size, reader );int nearest_neighbor = naiveNearestNeighbor( descriptor, kp->laplacian, imageKeypoints, imageDescriptors );if( nearest_neighbor >= 0 ){ptpairs.push_back(i);ptpairs.push_back(nearest_neighbor);}}
}/* a rough implementation for object location */
int
locatePlanarObject( const CvSeq* objectKeypoints, const CvSeq* objectDescriptors,const CvSeq* imageKeypoints, const CvSeq* imageDescriptors,const CvPoint src_corners[4], CvPoint dst_corners[4] )
{double h[9];CvMat _h = cvMat(3, 3, CV_64F, h);vector<int> ptpairs;vector<CvPoint2D32f> pt1, pt2;CvMat _pt1, _pt2;int i, n;findPairs( objectKeypoints, objectDescriptors, imageKeypoints, imageDescriptors, ptpairs );n = ptpairs.size()/2;if( n < 4 )return 0;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;}_pt1 = cvMat(1, n, CV_32FC2, &pt1[0] );_pt2 = cvMat(1, n, CV_32FC2, &pt2[0] );if( !cvFindHomography( &_pt1, &_pt2, &_h, CV_RANSAC, 5 ))return 0;for( i = 0; i < 4; i++ ){double x = src_corners[i].x, y = src_corners[i].y;double Z = 1./(h[6]*x + h[7]*y + h[8]);double X = (h[0]*x + h[1]*y + h[2])*Z;double Y = (h[3]*x + h[4]*y + h[5])*Z;dst_corners[i] = cvPoint(cvRound(X), cvRound(Y));}return 1;
}int main(int argc, char** argv)
{const char* object_filename = argc == 3 ? argv[1] : "box.png";const char* scene_filename = argc == 3 ? argv[2] : "box_in_scene.png";CvMemStorage* storage = cvCreateMemStorage(0);cvNamedWindow("Object", 1);cvNamedWindow("Object Correspond", 1);static CvScalar colors[] = {{{0,0,255}},{{0,128,255}},{{0,255,255}},{{0,255,0}},{{255,128,0}},{{255,255,0}},{{255,0,0}},{{255,0,255}},{{255,255,255}}};IplImage* object = cvLoadImage( object_filename, CV_LOAD_IMAGE_GRAYSCALE );IplImage* image = cvLoadImage( scene_filename, CV_LOAD_IMAGE_GRAYSCALE );if( !object || !image ){fprintf( stderr, "Can not load %s and/or %s\n""Usage: find_obj [<object_filename> <scene_filename>]\n",object_filename, scene_filename );exit(-1);}IplImage* object_color = cvCreateImage(cvGetSize(object), 8, 3);cvCvtColor( object, object_color, CV_GRAY2BGR );CvSeq *objectKeypoints = 0, *objectDescriptors = 0;CvSeq *imageKeypoints = 0, *imageDescriptors = 0;int i;CvSURFParams params = cvSURFParams(500, 1);double tt = (double)cvGetTickCount();cvExtractSURF( object, 0, &objectKeypoints, &objectDescriptors, storage, params );printf("Object Descriptors: %d\n", objectDescriptors->total);cvExtractSURF( image, 0, &imageKeypoints, &imageDescriptors, storage, params );printf("Image Descriptors: %d\n", imageDescriptors->total);tt = (double)cvGetTickCount() - tt;printf( "Extraction time = %gms\n", tt/(cvGetTickFrequency()*1000.));CvPoint src_corners[4] = {{0,0}, {object->width,0}, {object->width, object->height}, {0, object->height}};CvPoint dst_corners[4];IplImage* correspond = cvCreateImage( cvSize(image->width, object->height+image->height), 8, 1 );cvSetImageROI( correspond, cvRect( 0, 0, object->width, object->height ) );cvCopy( object, correspond );cvSetImageROI( correspond, cvRect( 0, object->height, correspond->width, correspond->height ) );cvCopy( image, correspond );cvResetImageROI( correspond );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];cvLine( correspond, cvPoint(r1.x, r1.y+object->height ),cvPoint(r2.x, r2.y+object->height ), colors[8] );}}vector<int> ptpairs;findPairs( objectKeypoints, objectDescriptors, imageKeypoints, imageDescriptors, ptpairs );for( i = 0; i < (int)ptpairs.size(); i += 2 ){CvSURFPoint* r1 = (CvSURFPoint*)cvGetSeqElem( objectKeypoints, ptpairs[i] );CvSURFPoint* r2 = (CvSURFPoint*)cvGetSeqElem( imageKeypoints, ptpairs[i+1] );cvLine( correspond, cvPointFrom32f(r1->pt),cvPoint(cvRound(r2->pt.x), cvRound(r2->pt.y+object->height)), colors[8] );}cvShowImage( "Object Correspond", correspond );for( i = 0; i < objectKeypoints->total; i++ ){CvSURFPoint* r = (CvSURFPoint*)cvGetSeqElem( objectKeypoints, i );CvPoint center;int radius;center.x = cvRound(r->pt.x);center.y = cvRound(r->pt.y);radius = cvRound(r->size*1.2/9.*2);cvCircle( object_color, center, radius, colors[0], 1, 8, 0 );}cvShowImage( "Object", object_color );cvWaitKey(0);cvDestroyWindow("Object");cvDestroyWindow("Object SURF");cvDestroyWindow("Object Correspond");return 0;
}
2019.08.06 更新
代码目录: frameworks/base/cmds/cv
Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= cv
LOCAL_SRC_FILES:= \cv.cppLOCAL_C_INCLUDES := \external/opencv/cv/include \external/opencv/cxcore/include \external/opencv/cvaux/include \external/opencv/ml/include \external/opencv/otherlibs/highgui \external/libpng \external/zlibLOCAL_STATIC_LIBRARIES := \libopencv \libcvhighgui \libcxcore \libcv \libcvaux \libcvmlLOCAL_SHARED_LIBRARIES := \libjpeg \libpng \libzLOCAL_MODULE_TAGS := optional
LOCAL_CFLAGS += -Wall -Werror
include $(BUILD_EXECUTABLE)
cv.cpp
#include <stdlib.h>
#include <stdio.h>
#include <string.h>#include <cv.h>
#include <highgui.h>
#include <ctype.h>
#include <iostream>
#include <vector>using namespace std;
IplImage *image = 0;double
compareSURFDescriptors( const float* d1, const float* d2, double best, int length )
{double total_cost = 0;assert( length % 4 == 0 );for( int i = 0; i < length; i += 4 ){double t0 = d1[i] - d2[i];double t1 = d1[i+1] - d2[i+1];double t2 = d1[i+2] - d2[i+2];double t3 = d1[i+3] - d2[i+3];total_cost += t0*t0 + t1*t1 + t2*t2 + t3*t3;if( total_cost > best )break;}return total_cost;
}int
naiveNearestNeighbor( const float* vec, int laplacian,const CvSeq* model_keypoints,const CvSeq* model_descriptors )
{int length = (int)(model_descriptors->elem_size/sizeof(float));int i, neighbor = -1;double d, dist1 = 1e6, dist2 = 1e6;CvSeqReader reader, kreader;cvStartReadSeq( model_keypoints, &kreader, 0 );cvStartReadSeq( model_descriptors, &reader, 0 );for( i = 0; i < model_descriptors->total; i++ ){const CvSURFPoint* kp = (const CvSURFPoint*)kreader.ptr;const float* mvec = (const float*)reader.ptr;CV_NEXT_SEQ_ELEM( kreader.seq->elem_size, kreader );CV_NEXT_SEQ_ELEM( reader.seq->elem_size, reader );if( laplacian != kp->laplacian )continue;d = compareSURFDescriptors( vec, mvec, dist2, length );if( d < dist1 ){dist2 = dist1;dist1 = d;neighbor = i;}else if ( d < dist2 )dist2 = d;}if ( dist1 < 0.6*dist2 )return neighbor;return -1;
}void
findPairs( const CvSeq* objectKeypoints, const CvSeq* objectDescriptors,const CvSeq* imageKeypoints, const CvSeq* imageDescriptors, vector<int>& ptpairs )
{int i;CvSeqReader reader, kreader;cvStartReadSeq( objectKeypoints, &kreader );cvStartReadSeq( objectDescriptors, &reader );ptpairs.clear();for( i = 0; i < objectDescriptors->total; i++ ){const CvSURFPoint* kp = (const CvSURFPoint*)kreader.ptr;const float* descriptor = (const float*)reader.ptr;CV_NEXT_SEQ_ELEM( kreader.seq->elem_size, kreader );CV_NEXT_SEQ_ELEM( reader.seq->elem_size, reader );int nearest_neighbor = naiveNearestNeighbor( descriptor, kp->laplacian, imageKeypoints, imageDescriptors );if( nearest_neighbor >= 0 ){ptpairs.push_back(i);ptpairs.push_back(nearest_neighbor);}}
}/* a rough implementation for object location */
int
locatePlanarObject( const CvSeq* objectKeypoints, const CvSeq* objectDescriptors,const CvSeq* imageKeypoints, const CvSeq* imageDescriptors,const CvPoint src_corners[4], CvPoint dst_corners[4] )
{double h[9];CvMat _h = cvMat(3, 3, CV_64F, h);vector<int> ptpairs;vector<CvPoint2D32f> pt1, pt2;CvMat _pt1, _pt2;int i, n;findPairs( objectKeypoints, objectDescriptors, imageKeypoints, imageDescriptors, ptpairs );n = ptpairs.size()/2;if( n < 4 )return 0;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;}_pt1 = cvMat(1, n, CV_32FC2, &pt1[0] );_pt2 = cvMat(1, n, CV_32FC2, &pt2[0] );if( !cvFindHomography( &_pt1, &_pt2, &_h, CV_RANSAC, 5 ))return 0;for( i = 0; i < 4; i++ ){double x = src_corners[i].x, y = src_corners[i].y;double Z = 1./(h[6]*x + h[7]*y + h[8]);double X = (h[0]*x + h[1]*y + h[2])*Z;double Y = (h[3]*x + h[4]*y + h[5])*Z;dst_corners[i] = cvPoint(cvRound(X), cvRound(Y));}return 1;
}int
match(char* object_filename,char* scene_filename){CvMemStorage* storage = cvCreateMemStorage(0);IplImage* object = cvLoadImage( object_filename, CV_LOAD_IMAGE_GRAYSCALE );IplImage* image = cvLoadImage( scene_filename, CV_LOAD_IMAGE_GRAYSCALE );if( !object ){fprintf( stderr, "Can not load %s\n",object_filename );return -1;}else if( !image ){fprintf( stderr, "Can not load %s\n",scene_filename );return -1;}else{CvSeq *objectKeypoints = 0, *objectDescriptors = 0;CvSeq *imageKeypoints = 0, *imageDescriptors = 0;CvSURFParams params = cvSURFParams(500, 1);double tt = (double)cvGetTickCount();cvExtractSURF( object, 0, &objectKeypoints, &objectDescriptors, storage, params );cvExtractSURF( image, 0, &imageKeypoints, &imageDescriptors, storage, params );tt = (double)cvGetTickCount() - tt;CvPoint src_corners[4] = {{0,0}, {object->width,0}, {object->width, object->height}, {0, object->height}};CvPoint dst_corners[4];if( locatePlanarObject( objectKeypoints, objectDescriptors, imageKeypoints,imageDescriptors, src_corners, dst_corners )){// find targetint i;for( i = 0; i < 4; i++ ){CvPoint r1 = dst_corners[i];fprintf(stdout,"%d,%d|",r1.x,r1.y);}fprintf(stdout,"\n");return 0;}fprintf( stderr, "Target not found\n");return -1;}
}int
main(int argc, char* argv[])
{ if (argc >= 4 && strcmp("match",argv[1]) == 0){match(argv[2],argv[3]);}else{fprintf(stderr, "usage:\n\t""cv match path-to/object.png path-to/scene.png\n""out:\n\t""(1X),(1Y)|(2X),(2Y)|(3X),(3Y)|(4X),(4Y)\n");}return -1;
}
build/target/product/core_minimal.mk
、 build/target/product/core_tiny.mk
增加编译入口
PRODUCT_PACKAGES +=
+ cv