opencv-ffi 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. data/.gitignore +7 -0
  2. data/Gemfile +15 -0
  3. data/README.md +126 -0
  4. data/Rakefile +52 -0
  5. data/docs/DocsIndex.md +1 -0
  6. data/docs/examples/load_image.rb +25 -0
  7. data/ext/Rakefile +13 -0
  8. data/ext/aishack-sift/.gitignore +4 -0
  9. data/ext/aishack-sift/Descriptor.h +34 -0
  10. data/ext/aishack-sift/KeyPoint.h +38 -0
  11. data/ext/aishack-sift/README +20 -0
  12. data/ext/aishack-sift/SIFT.cpp +1036 -0
  13. data/ext/aishack-sift/SIFT.h +84 -0
  14. data/ext/aishack-sift/example/.gitignore +2 -0
  15. data/ext/aishack-sift/example/Makefile +24 -0
  16. data/ext/aishack-sift/example/MySIFT.cpp +29 -0
  17. data/ext/aishack-sift/mkrf_conf.rb +13 -0
  18. data/ext/aishack-sift/siftlib.cpp +85 -0
  19. data/ext/eigen/.gitignore +4 -0
  20. data/ext/eigen/eigen_polynomial.cpp +41 -0
  21. data/ext/eigen/eigen_svd.cpp +100 -0
  22. data/ext/eigen/mkrf_conf.rb +14 -0
  23. data/ext/mkrf-monkey.rb +85 -0
  24. data/ext/mkrf-rakehelper-monkey.rb +52 -0
  25. data/ext/mkrf_conf.rb +3 -0
  26. data/ext/opencv-ffi/.gitignore +4 -0
  27. data/ext/opencv-ffi/matcher_helper.cpp +56 -0
  28. data/ext/opencv-ffi/mkrf_conf.rb +12 -0
  29. data/ext/opencv-ffi/vector_math.cpp +39 -0
  30. data/ext/opensurf/.gitignore +4 -0
  31. data/ext/opensurf/README +38 -0
  32. data/ext/opensurf/fasthessian.cpp +376 -0
  33. data/ext/opensurf/fasthessian.h +108 -0
  34. data/ext/opensurf/integral.cpp +58 -0
  35. data/ext/opensurf/integral.h +55 -0
  36. data/ext/opensurf/ipoint.cpp +108 -0
  37. data/ext/opensurf/ipoint.h +76 -0
  38. data/ext/opensurf/kmeans.h +172 -0
  39. data/ext/opensurf/mkrf_conf.rb +10 -0
  40. data/ext/opensurf/responselayer.h +92 -0
  41. data/ext/opensurf/surf.cpp +317 -0
  42. data/ext/opensurf/surf.h +66 -0
  43. data/ext/opensurf/surflib.cpp +98 -0
  44. data/ext/opensurf/surflib.h +96 -0
  45. data/ext/opensurf/utils.cpp +357 -0
  46. data/ext/opensurf/utils.h +63 -0
  47. data/lib/.gitignore +1 -0
  48. data/lib/opencv-ffi-ext/eigen.rb +84 -0
  49. data/lib/opencv-ffi-ext/features2d.rb +4 -0
  50. data/lib/opencv-ffi-ext/matcher_helper.rb +24 -0
  51. data/lib/opencv-ffi-ext/opensurf.rb +217 -0
  52. data/lib/opencv-ffi-ext/sift.rb +118 -0
  53. data/lib/opencv-ffi-ext/vector_math.rb +115 -0
  54. data/lib/opencv-ffi-wrappers.rb +7 -0
  55. data/lib/opencv-ffi-wrappers/core.rb +24 -0
  56. data/lib/opencv-ffi-wrappers/core/iplimage.rb +50 -0
  57. data/lib/opencv-ffi-wrappers/core/mat.rb +268 -0
  58. data/lib/opencv-ffi-wrappers/core/misc_draw.rb +44 -0
  59. data/lib/opencv-ffi-wrappers/core/point.rb +286 -0
  60. data/lib/opencv-ffi-wrappers/core/rect.rb +40 -0
  61. data/lib/opencv-ffi-wrappers/core/scalar.rb +104 -0
  62. data/lib/opencv-ffi-wrappers/core/size.rb +88 -0
  63. data/lib/opencv-ffi-wrappers/enumerable.rb +10 -0
  64. data/lib/opencv-ffi-wrappers/features2d.rb +17 -0
  65. data/lib/opencv-ffi-wrappers/features2d/image_patch.rb +322 -0
  66. data/lib/opencv-ffi-wrappers/features2d/star.rb +111 -0
  67. data/lib/opencv-ffi-wrappers/features2d/surf.rb +115 -0
  68. data/lib/opencv-ffi-wrappers/highgui.rb +10 -0
  69. data/lib/opencv-ffi-wrappers/imgproc.rb +4 -0
  70. data/lib/opencv-ffi-wrappers/imgproc/features.rb +35 -0
  71. data/lib/opencv-ffi-wrappers/imgproc/geometric.rb +39 -0
  72. data/lib/opencv-ffi-wrappers/matcher.rb +297 -0
  73. data/lib/opencv-ffi-wrappers/matrix.rb +37 -0
  74. data/lib/opencv-ffi-wrappers/misc.rb +41 -0
  75. data/lib/opencv-ffi-wrappers/misc/params.rb +34 -0
  76. data/lib/opencv-ffi-wrappers/sequence.rb +37 -0
  77. data/lib/opencv-ffi-wrappers/vectors.rb +38 -0
  78. data/lib/opencv-ffi.rb +12 -0
  79. data/lib/opencv-ffi/calib3d.rb +26 -0
  80. data/lib/opencv-ffi/core.rb +15 -0
  81. data/lib/opencv-ffi/core/draw.rb +68 -0
  82. data/lib/opencv-ffi/core/dynamic.rb +13 -0
  83. data/lib/opencv-ffi/core/library.rb +5 -0
  84. data/lib/opencv-ffi/core/operations.rb +122 -0
  85. data/lib/opencv-ffi/core/point.rb +22 -0
  86. data/lib/opencv-ffi/core/types.rb +172 -0
  87. data/lib/opencv-ffi/cvffi.rb +8 -0
  88. data/lib/opencv-ffi/features2d.rb +7 -0
  89. data/lib/opencv-ffi/features2d/library.rb +6 -0
  90. data/lib/opencv-ffi/features2d/star.rb +30 -0
  91. data/lib/opencv-ffi/features2d/surf.rb +38 -0
  92. data/lib/opencv-ffi/highgui.rb +31 -0
  93. data/lib/opencv-ffi/imgproc.rb +9 -0
  94. data/lib/opencv-ffi/imgproc/features.rb +37 -0
  95. data/lib/opencv-ffi/imgproc/geometric.rb +42 -0
  96. data/lib/opencv-ffi/imgproc/library.rb +6 -0
  97. data/lib/opencv-ffi/imgproc/misc.rb +39 -0
  98. data/lib/opencv-ffi/version.rb +3 -0
  99. data/opencv-ffi.gemspec +26 -0
  100. data/test/core/test_draw.rb +46 -0
  101. data/test/core/test_operations.rb +135 -0
  102. data/test/core/test_size.rb +14 -0
  103. data/test/core/test_text.rb +52 -0
  104. data/test/ext/test_eigen.rb +105 -0
  105. data/test/ext/test_opensurf.rb +35 -0
  106. data/test/ext/test_sift.rb +26 -0
  107. data/test/ext/test_vector_math.rb +85 -0
  108. data/test/features2d/test_surf.rb +63 -0
  109. data/test/imgproc/test_goodfeatures.rb +18 -0
  110. data/test/setup.rb +65 -0
  111. data/test/test_calib3d.rb +38 -0
  112. data/test/test_core.rb +26 -0
  113. data/test/test_ext.rb +8 -0
  114. data/test/test_features2d.rb +9 -0
  115. data/test/test_files/images/IMG_7088.JPG +0 -0
  116. data/test/test_files/images/IMG_7088_small.JPG +0 -0
  117. data/test/test_files/images/IMG_7089.JPG +0 -0
  118. data/test/test_highgui.rb +26 -0
  119. data/test/test_imgproc.rb +35 -0
  120. data/test/test_wrappers.rb +8 -0
  121. data/test/wrappers/core/test_draw.rb +41 -0
  122. data/test/wrappers/core/test_mat.rb +40 -0
  123. data/test/wrappers/core/test_operations.rb +35 -0
  124. data/test/wrappers/core/test_types.rb +235 -0
  125. data/test/wrappers/features2d/test_image_patch.rb +108 -0
  126. data/test/wrappers/test_imgproc.rb +87 -0
  127. data/test/wrappers/test_matcher.rb +96 -0
  128. data/test/wrappers/test_star.rb +28 -0
  129. data/test/wrappers/test_surf.rb +36 -0
  130. metadata +234 -0
@@ -0,0 +1,84 @@
1
+ /******************************************************
2
+ * Code by Utkarsh Sinha
3
+ * Based on JIFT by Jun Liu
4
+ * Visit http://aishack.in/ for more indepth articles and tutorials
5
+ * on artificial intelligence
6
+ * Use, reuse, modify, hack, kick. Do whatever you want with
7
+ * this code :)
8
+ ******************************************************/
9
+
10
+ #include <opencv2/core/core.hpp>
11
+ #include <opencv2/highgui/highgui.hpp>
12
+
13
+ #include "KeyPoint.h"
14
+ #include "Descriptor.h"
15
+
16
+ #define SIGMA_ANTIALIAS 0.5
17
+ #define SIGMA_PREBLUR 1.0
18
+ #define CURVATURE_THRESHOLD 5.0
19
+ #define CONTRAST_THRESHOLD 0.03 // in terms of 255
20
+ #define NUM_BINS 36
21
+ #define MAX_KERNEL_SIZE 20
22
+ #define FEATURE_WINDOW_SIZE 16
23
+ #define DESC_NUM_BINS 8
24
+ #define FVSIZE 128
25
+ #define FV_THRESHOLD 0.2
26
+
27
+
28
+ class SIFT
29
+ {
30
+ public:
31
+ SIFT(IplImage* img, int octaves, int intervals);
32
+ SIFT(const char* filename, int octaves, int intervals);
33
+ ~SIFT();
34
+
35
+ void DoSift();
36
+ void DetectKeypoints();
37
+ void DescribeKeypoints();
38
+
39
+ void ShowKeypoints();
40
+ void ShowAbsSigma();
41
+
42
+ const vector<Keypoint> keypoints( void ) { return m_keyPoints; }
43
+ const vector<Descriptor> descriptors( void ) { return m_keyDescs; }
44
+
45
+ private:
46
+ void GenerateLists();
47
+ void BuildScaleSpace();
48
+ void DetectExtrema();
49
+ void AssignOrientations();
50
+ void ExtractKeypointDescriptors();
51
+
52
+ unsigned int GetKernelSize(double sigma, double cut_off=0.001);
53
+ CvMat* BuildInterpolatedGaussianTable(unsigned int size, double sigma);
54
+ double gaussian2D(double x, double y, double sigma);
55
+
56
+
57
+ private:
58
+ IplImage* m_srcImage; // The image we're working on
59
+ unsigned int m_numOctaves; // The desired number of octaves
60
+ unsigned int m_numIntervals; // The desired number of intervals
61
+ unsigned int m_numKeypoints; // The number of keypoints detected
62
+
63
+ IplImage*** m_gList; // A 2D array to hold the different gaussian blurred images
64
+ IplImage*** m_dogList; // A 2D array to hold the different DoG images
65
+ IplImage*** m_extrema; // A 2D array to hold binary images. In the binary image, 1 = extrema, 0 = not extrema
66
+ double** m_absSigma; // A 2D array to hold the sigma used to blur a particular image
67
+
68
+ class Extrema {
69
+ public:
70
+ int octave, interval, xi, yi;
71
+
72
+ Extrema( int oct, int intv, int x, int y )
73
+ : octave( oct ), interval( intv ), xi( x ), yi( y )
74
+ {}
75
+ };
76
+
77
+ vector<Extrema> extrema;
78
+
79
+ vector<Keypoint> m_keyPoints; // Holds each keypoint's basic info
80
+ vector<Descriptor> m_keyDescs; // Holds each keypoint's descriptor
81
+
82
+ IplImage *magnitude_mat( int i, int j );
83
+ double orientation_at( int i, int j, int xi, int yi );
84
+ };
@@ -0,0 +1,2 @@
1
+ MySIFT
2
+ ReadMe.txt
@@ -0,0 +1,24 @@
1
+
2
+ CXX = g++
3
+ BIN = MySIFT
4
+ OBJS = MySIFT.o ../SIFT.o
5
+
6
+ CFLAGS = -ggdb -I.. -I/localhome/amm299/usr/include
7
+ LFLAGS = -L/localhome/amm299/usr/lib
8
+ LIBS = -lopencv_core -lopencv_highgui -lopencv_imgproc
9
+
10
+
11
+ default: run
12
+
13
+ run: $(BIN)
14
+ LD_LIBRARY_PATH=~/usr/lib ./MySIFT
15
+
16
+
17
+ $(BIN): $(OBJS)
18
+ $(CXX) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
19
+
20
+ .cpp.o:
21
+ $(CXX) -c $(CFLAGS) -o $@ $^
22
+
23
+ clean:
24
+ rm -f $(BIN) *.o
@@ -0,0 +1,29 @@
1
+ /******************************************************
2
+ * Code by Utkarsh Sinha
3
+ * Based on JIFT by Jun Liu
4
+ * Visit http://aishack.in/ for more indepth articles and tutorials
5
+ * on artificial intelligence
6
+ * Use, reuse, modify, hack, kick. Do whatever you want with
7
+ * this code :)
8
+ ******************************************************/
9
+
10
+ // MySIFT.cpp : Defines the entry point for the console application.
11
+ //
12
+
13
+ #include "SIFT.h"
14
+
15
+ #include <opencv2/core/core.hpp>
16
+
17
+ // The main function!
18
+ int main()
19
+ {
20
+ // Create an instance of SIFT
21
+ SIFT *sift = new SIFT("IMG_7088_small.JPG", 1, 5);
22
+
23
+ sift->DoSift(); // Find keypoints
24
+
25
+ // Cleanup and exit
26
+ delete sift;
27
+ return 0;
28
+ }
29
+
@@ -0,0 +1,13 @@
1
+ require '../mkrf-monkey'
2
+
3
+ Mkrf::Generator.new('libcvffi_sift', [ "*.cpp" ], { :compiler=>"g++"}) { |g|
4
+ g.include_library 'stdc++'
5
+
6
+ raise "Can't find 'opencv_core'" unless g.include_library 'opencv_core', 'main', "#{ENV['HOME']}/usr/lib"
7
+ raise "Can't find 'opencv_imgproc'" unless g.include_library 'opencv_imgproc', 'main', "#{ENV['HOME']}/usr/lib"
8
+ raise "Can't find 'opencv_highgui'" unless g.include_library 'opencv_highgui', 'main', "#{ENV['HOME']}/usr/lib"
9
+
10
+ g.cflags += "-I#{ENV['HOME']}/usr/include "
11
+
12
+ }
13
+
@@ -0,0 +1,85 @@
1
+
2
+ #include "SIFT.h"
3
+
4
+ #include <stdio.h>
5
+
6
+ typedef struct {
7
+ int octaves;
8
+ int intervals;
9
+ } SiftParams_t;
10
+
11
+ typedef struct {
12
+ float xi;
13
+ float yi;
14
+ float mag[NUM_BINS];
15
+ float orien[NUM_BINS];
16
+ unsigned int num_bins;
17
+
18
+ unsigned int scale;
19
+ } SiftKeypoint_t;
20
+
21
+ typedef struct {
22
+ float xi, yi;
23
+ float fv[FVSIZE];
24
+ unsigned int fv_size;
25
+ } SiftDescriptor_t;
26
+
27
+ typedef struct {
28
+ SiftKeypoint_t *kps;
29
+ SiftDescriptor_t *descs;
30
+ unsigned int len;
31
+ } SiftResults_t;
32
+
33
+
34
+ SiftResults_t *buildSiftResults( const vector<Keypoint> kps, const vector<Descriptor> descs )
35
+ {
36
+ printf("Creating array for %d keypoints.\n", kps.size() );
37
+ SiftKeypoint_t *kp_array = new SiftKeypoint_t[ kps.size() ];
38
+
39
+ unsigned int idx = 0;
40
+ for( vector<Keypoint>::const_iterator itr = kps.begin(); itr != kps.end(); itr++ ) {
41
+ kp_array[idx].xi = (*itr).xi;
42
+ kp_array[idx].yi = (*itr).yi;
43
+ kp_array[idx].scale = (*itr).scale;
44
+
45
+ assert( (*itr).mag.size() == (*itr).orien.size() );
46
+
47
+ kp_array[idx].num_bins = (*itr).mag.size();
48
+ for( unsigned int j = 0; j < (*itr).mag.size(); j++ ) {
49
+ kp_array[idx].mag[j] = (*itr).mag[j];
50
+ kp_array[idx].orien[j] = (*itr).orien[j];
51
+ }
52
+
53
+ idx++;
54
+ }
55
+
56
+ printf("Creating array for %d descriptors.\n", descs.size() );
57
+ SiftDescriptor_t *desc_array = new SiftDescriptor_t[ descs.size() ];
58
+ idx = 0;
59
+ for( vector<Descriptor>::const_iterator itr = descs.begin(); itr != descs.end(); itr++ ) {
60
+ desc_array[idx].xi = (*itr).xi;
61
+ desc_array[idx].yi = (*itr).yi;
62
+
63
+ desc_array[idx].fv_size = FVSIZE;
64
+ for( unsigned int i = 0; i < FVSIZE; i++ ) {
65
+ desc_array[idx].fv[i] = (*itr).fv[i];
66
+ }
67
+ ++idx;
68
+ }
69
+
70
+ SiftResults_t *results= new SiftResults_t;
71
+ results->kps = kp_array;
72
+ results->descs = desc_array;
73
+ results->len = kps.size();
74
+
75
+ return results;
76
+ }
77
+
78
+ extern "C"
79
+ SiftResults_t *siftDetectDescribe( IplImage *img, SiftParams_t params )
80
+ {
81
+ SIFT sift( img, params.octaves, params.intervals );
82
+ sift.DoSift();
83
+
84
+ return buildSiftResults( sift.keypoints(), sift.descriptors() );
85
+ }
@@ -0,0 +1,4 @@
1
+ *.o
2
+ Rakefile
3
+ libcvffi_eigen.so
4
+ mkrf.log
@@ -0,0 +1,41 @@
1
+
2
+ #include <eigen3/Eigen/Core>
3
+ #include <eigen3/unsupported/Eigen/Polynomials>
4
+ #include <vector>
5
+ #include <iostream>
6
+
7
+ using Eigen::MatrixXf;
8
+ using namespace Eigen;
9
+ using namespace std;
10
+
11
+
12
+ typedef struct {
13
+ double a[7];
14
+ } Eigen7d_t;
15
+
16
+ typedef struct {
17
+ double a[6];
18
+ } Eigen6d_t;
19
+
20
+ extern "C"
21
+ Eigen6d_t eigenPoly6Solver( Eigen7d_t coeff )
22
+ {
23
+ Eigen::Matrix<double,7,1> polynomial;
24
+ for( unsigned int i = 0; i < 7; i++ ) polynomial[i] = coeff.a[i];
25
+
26
+ PolynomialSolver<double,6> psolve( polynomial );
27
+
28
+ std::vector<double> realRoots;
29
+ psolve.realRoots( realRoots );
30
+
31
+ Eigen6d_t result;
32
+ for( unsigned int i = 0; i < 6; i++ ) {
33
+ if( i < realRoots.size() )
34
+ result.a[i] = realRoots[i];
35
+ else
36
+ result.a[i] = 0.0;
37
+ }
38
+
39
+ return result;
40
+ }
41
+
@@ -0,0 +1,100 @@
1
+
2
+ #include <opencv2/core/core.hpp>
3
+ #include <opencv2/core/core_c.h>
4
+ #include <eigen3/Eigen/Core>
5
+ #include <eigen3/Eigen/SVD>
6
+ #include <eigen3/Eigen/Eigenvalues>
7
+
8
+ using Eigen::MatrixXf;
9
+ using namespace Eigen;
10
+ using namespace cv;
11
+
12
+
13
+ typedef struct {
14
+ CvMat *D;
15
+ CvMat *U, *V;
16
+ } EigenSVDResult_t;
17
+
18
+ MatrixXf cvMatToEigen( CvMat *A )
19
+ {
20
+ MatrixXf a( A->rows, A->cols );
21
+ for( int i = 0; i < A->rows; i++ ) {
22
+ for( int j = 0; j < A->cols; j++ ) {
23
+ a(i,j) = cvGetReal2D( A, i, j );
24
+ }
25
+ }
26
+ return a;
27
+ }
28
+
29
+ CvMat *eigenToCvMat( MatrixXf a )
30
+ {
31
+ CvMat *mat = cvCreateMat( a.rows(), a.cols(), CV_32F );
32
+
33
+ for( int i = 0; i < a.rows(); i++ ) {
34
+ for( int j = 0; j < a.cols(); j++ ) {
35
+ cvSetReal2D( mat, i, j, a(i,j) );
36
+ }
37
+ }
38
+
39
+ return mat;
40
+ }
41
+
42
+ extern "C"
43
+ void eigenSvdWithCvMat( CvMat* A, EigenSVDResult_t *result, unsigned char thin )
44
+ {
45
+ // Brute force pack/unpack I'm afraid
46
+ // assert( ( A->type == CV_32F ) || (A->type == CV_64F) );
47
+
48
+ MatrixXf m = cvMatToEigen( A );
49
+ unsigned int options = (thin == 0) ? (ComputeFullU | ComputeFullV) : (ComputeThinU | ComputeThinV);
50
+ JacobiSVD<MatrixXf> svd( m, options );
51
+
52
+ result->D = eigenToCvMat( svd.singularValues() );
53
+ result->U = eigenToCvMat( svd.matrixU() );
54
+ result->V = eigenToCvMat( svd.matrixV() );
55
+ }
56
+
57
+ typedef struct {
58
+ CvMat *D;
59
+ CvMat *V;
60
+ } EigenDecompResult_t;
61
+
62
+ CvMat *eigenvaluesToCvMat( EigenSolver<MatrixXf>::EigenvalueType a )
63
+ {
64
+ CvMat *mat = cvCreateMat( a.rows(), a.cols(), CV_32F );
65
+
66
+ for( int i = 0; i < a.rows(); i++ ) {
67
+ for( int j = 0; j < a.cols(); j++ ) {
68
+ cvSetReal2D( mat, i, j, a(i,j).real() );
69
+ }
70
+ }
71
+
72
+ return mat;
73
+ }
74
+
75
+ CvMat *eigenvectorsToCvMat( EigenSolver<MatrixXf>::EigenvectorsType a )
76
+ {
77
+ CvMat *mat = cvCreateMat( a.rows(), a.cols(), CV_32F );
78
+
79
+ for( int i = 0; i < a.rows(); i++ ) {
80
+ for( int j = 0; j < a.cols(); j++ ) {
81
+ cvSetReal2D( mat, i, j, a(i,j).real() );
82
+ }
83
+ }
84
+
85
+ return mat;
86
+ }
87
+
88
+ extern "C"
89
+ void eigenDecompWithCvMat( CvMat *A, EigenDecompResult_t *result )
90
+ {
91
+ // Brute force pack/unpack I'm afraid
92
+ // assert( ( A->type == CV_32F ) || (A->type == CV_64F) );
93
+
94
+ MatrixXf m = cvMatToEigen( A );
95
+ EigenSolver<MatrixXf> eig( m );
96
+
97
+ result->D = eigenvaluesToCvMat( eig.eigenvalues() );
98
+ result->V = eigenvectorsToCvMat( eig.eigenvectors() );
99
+ }
100
+
@@ -0,0 +1,14 @@
1
+ require '../mkrf-monkey'
2
+
3
+ # The compiler for availability checking must be specified as 'g++'
4
+ # otherwise it will use gcc and choke on Eigen
5
+ #
6
+ Mkrf::Generator.new('libcvffi_eigen', [ "*.cpp" ], { :compiler=>"g++"}) { |g|
7
+ g.include_library 'stdc++'
8
+ raise "Can't find 'opencv_core'" unless g.include_library 'opencv_core', 'main', "#{ENV['HOME']}/usr/lib"
9
+ raise "Can't find #include<eigne3/Eigen/Core>" unless g.include_header 'eigen3/Eigen/Core', "#{ENV['HOME']}/usr/include"
10
+
11
+ # This is awkward. Eigen's unsupported has internal includes <Eigen/Core>
12
+ g.cflags += "-I#{ENV['HOME']}/usr/include -I/usr/local/include/eigen3 -I#{ENV['HOME']}/usr/include/eigen3"
13
+ }
14
+
@@ -0,0 +1,85 @@
1
+
2
+ require 'mkrf'
3
+
4
+ # I admit it, I'm monkey-patching mkrf to get the behavior I want.
5
+ module Mkrf
6
+
7
+ class Generator
8
+
9
+ def rakefile_contents # :nodoc:
10
+ objext = CONFIG['OBJEXT']
11
+ cc = CONFIG['CC'] || 'gcc'
12
+ cpp = CONFIG['CXX'] || 'g++'
13
+ extension_sym = File.basename( @extension_name, ".#{CONFIG['DLEXT']}" ).to_sym
14
+
15
+
16
+ <<-END_RAKEFILE
17
+ # Generated by mkrf, monkey patched for opencv-ffi
18
+ require 'rake/clean'
19
+
20
+
21
+ SRC = FileList[#{sources.join(',')}]
22
+ OBJ = SRC.ext('#{objext}')
23
+ CC = '#{cc}'
24
+ CPP = '#{cpp}'
25
+
26
+ CLEAN.include(OBJ)
27
+ CLOBBER.include('#{@extension_name}', 'mkrf.log', 'Rakefile')
28
+
29
+ ADDITIONAL_OBJECTS = '#{objects}'
30
+
31
+ LDSHARED = "#{@available.ldshared_string} #{ldshared}"
32
+
33
+ LIBPATH = "#{library_path(CONFIG['libdir'])} #{@available.library_paths_compile_string}"
34
+
35
+ INCLUDES = "#{@available.includes_compile_string}"
36
+
37
+ LIBS = "#{@available.library_compile_string}"
38
+
39
+ CFLAGS = "#{cflags} #{defines_compile_string}"
40
+
41
+ RUBYARCHDIR = "\#{ENV["RUBYARCHDIR"]}"
42
+ LIBRUBYARG_SHARED = "#{CONFIG['LIBRUBYARG_SHARED']}"
43
+
44
+ task :default => :build_library
45
+
46
+ # Add one layer of indirection so I can generically call "rake build_library"
47
+ # and have it work ... or not work if the wrong rakefile is being run
48
+ task :build_library => '#{@extension_name}'
49
+
50
+ rule '.#{objext}' => '.c' do |t|
51
+ sh "\#{CC} \#{CFLAGS} \#{INCLUDES} -o \#{t.name} -c \#{t.source}"
52
+ end
53
+
54
+ rule '.#{objext}' => '.cpp' do |t|
55
+ sh "\#{CPP} \#{CFLAGS} \#{INCLUDES} -o \#{t.name} -c \#{t.source}"
56
+ end
57
+
58
+ DEPS = OBJ.clone.add('Rakefile')
59
+ desc "Build this extension"
60
+ file '#{@extension_name}' => DEPS do
61
+ sh "\#{LDSHARED} \#{LIBPATH} #{@available.ld_outfile(@extension_name)} \#{OBJ} \#{ADDITIONAL_OBJECTS} \#{LIBS} \#{LIBRUBYARG_SHARED}"
62
+ end
63
+
64
+ desc "Rebuild rakefile"
65
+ file 'Rakefile' => 'mkrf_conf.rb' do |t|
66
+ ruby 'mkrf_conf.rb'
67
+ puts "Rebuilt Rakefile. Run \'rake #{extension_sym.to_s}\' again"
68
+ end
69
+
70
+ desc "Install this extension"
71
+ task :install => '#{@extension_name}' do
72
+ makedirs "\#{RUBYARCHDIR}"
73
+ install "#{@extension_name}", "\#{RUBYARCHDIR}"
74
+ end
75
+
76
+ #{additional_code}
77
+ END_RAKEFILE
78
+ end
79
+
80
+
81
+ end
82
+
83
+ end
84
+
85
+