Recently Macports is gaining more attention from the open source community on the Mac platform. It has a build for OpenCV which is every intuitive to install in terminal. Here is the package info of this OpenCV port:
$ port info opencv
opencv @3.0.0_1 (graphics, science)
Variants: contrib, dc1394, debug, eigen, java, opencl, openni, python27, python34, qt4, qt5, tbb,
universal, vtk
Description: OpenCV is a library that is mainly aimed at real time computer vision. Some example
areas would be Human-Computer Interaction (HCI), Object Identification, Segmentation and
Recognition, Face Recognition, Gesture Recognition, Motion Tracking, Ego Motion, Motion
Understanding, Structure From Motion (SFM), and Mobile Robotics.
Homepage: http://opencv.org
Extract Dependencies: unzip
Build Dependencies: cmake, pkgconfig
Library Dependencies: zlib, bzip2, libpng, jpeg, jasper, tiff, ilmbase, openexr, ffmpeg
Platforms: darwin
License: BSD
Maintainers: stromnov@macports.org, openmaintainer@macports.org
Usually default install location is /opt/local/
. We use the image_external
example from this link and the original source code is from
/Applications/Mathematica.app/Contents/SystemFiles/Links/LibraryLink/LibraryResources/Source/image_external.c
assuming you have the default mathematica installation on the Mac machine.
First we load the LibraryLink
and CCompilerDriver
Needs["LibraryLink`"]
Needs["CCompilerDriver`"]
I put a modified version of the source code in the same directory as the working notebook (image_extern2.c
contains some type casting of cvCreateImage -> ImageData
which returns a char *
)
Load the path to the source file:
In[3]:= sourcePath=NotebookDirectory[]
Out[3]= /Users/shenghuiyang/Desktop/opencv_Mathematica/
To build this file, we have 2 options. First, we can use the CreateLibrary
function:
lib=CreateLibrary[{FileNameJoin[{sourcePath,"image_extern2.c"}]},"image_external",
"IncludeDirectories" -> {
"/opt/local/include",
"/opt/local/include/opencv",
"/opt/local/include/opencv2/imgproc",
"/opt/local/include/libraw"
},
"LibraryDirectories" -> {"/opt/local/lib"},
"Libraries" -> { "opencv_core", "opencv_highgui","opencv_imgproc", "raw"},
"Debug"->False
];
The key to use this function with Macports's OpenCV (and libra
) is to set the proper directories. Use the following command in the terminal to find them
pkg-config --cflags --libs opencv
pkg-config --cflags --libs libraw
One thing to note is that the actual file of these libraries are libopencv_core
and so on. You should omit the lib
before the file name on OS X. Load the dynamic library with LibraryFunctionLoad
function
opencvDilate =
LibraryFunctionLoad[lib,
"opencv_dilate", {{LibraryDataType[Image], "Constant"},
Integer}, {LibraryDataType[Image]}]
The second method is to use a makefile
to build the dynamic library first and use the LibaryFunctionLoad
to call the name of the library directly.
CC = clang
TargetLocation = /Users/shenghuiyang/Library/Mathematica/SystemFiles/LibraryResources/MacOSX-x86-64
$(shell rm $(TargetLocation)/image_external.dylib)
SOURCE=image_extern2.c
OBJECTS =image_external.dylib
CFLAGS =...
IFLAGS = ...
FRAMEWORKFLAGS =...
LIBDIR = -L/opt/local/lib
LIBFLAGS = -lopencv_core -lopencv_highgui -lopencv_imgproc
LIBFLAGS += -lraw -lstdc++ -lstdc++
Target = image_external.dylib
$(TargetLocation)/image_external.dylib:$(SOURCE)
$(CC) -dynamiclib -o $(TargetLocation)/image_external.dylib $(CFALGS) $(FRAMEWORKFLAG) $(IFLAGS) $(SOURCE) $(LIBDIR) $(LIBFLAGS) 2>&1
How do I know this file works? Well I called CreateLibrary
with this option in ShellCommandFunction
:
lib=CreateLibrary[{FileNameJoin[{sourcePath,"image_extern2.c"}]},"image_external",
"IncludeDirectories" -> {...},
"ShellCommandFunction"->Print
];
/usr/bin/clang -dynamiclib -o "/Users/shenghuiyang/Library/Mathematica/SystemFiles/LibraryResources/MacOSX-x86-64/Working-shenghuiy-37929-2049441792-2/image_external.dylib" -m64 -fPIC -O2 -mmacosx-version-min=10.6 -framework Foundation -I"/Applications/Mathematica.app/Contents/SystemFiles/IncludeFiles/C" -I"/Applications/Mathematica.app/Contents/SystemFiles/Links/MathLink/DeveloperKit/MacOSX-x86-64/CompilerAdditions" -I"/opt/local/include" -I"/opt/local/include/opencv" -I"/opt/local/include/opencv2/imgproc" -I"/opt/local/include/libraw" "/Users/shenghuiyang/Desktop/opencv_Mathematica/image_extern2.c" -F"/Applications/Mathematica.app/Contents/SystemFiles/Links/MathLink/DeveloperKit/MacOSX-x86-64/CompilerAdditions" -L"/opt/local/lib" -framework "mathlink" -l"opencv_core" -l"opencv_highgui" -l"opencv_imgproc" -l"raw" -lstdc++ 2>&1
You can download the makefile
in the attachment. After this makefile is executed, the .dylib
is transferred to a member of $LibraryPath
automatically. Then we can load this library with
opencvDilate=LibraryFunctionLoad["image_external","opencv_dilate",{{LibraryDataType[Image],"Constant"},Integer},{LibraryDataType[Image]}]
Finally you can use the opencvDilate function in Mathematica directly as the following screenshot. In a very similar way we can load the readRawImage
to load the .arw
file into Mathematica (about 60MB in size)
Attachments: