読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

OpenCV3をMacにインストールする

追記(2015/07/24): HomeBrewにフォーミュラhomebrew/science/opencv3が追加されて、特に苦労することなくインストールできるようになっていました。

OpenCV3 ベータ版が昨年11月に公開されました。
Python3でOpenCV3のプログラムを書いてみたいと思い、インストールしようとしたところ、色々、障害があり、それらを解決せずに逃げてなんとかインストールできました。

以下、備忘録です。

1. pyenvを諦める。
具体的には.bash_profileでpyenvのパスを通すスクリプトコメントアウト

2. brew install python3

3. pip3 install numpy
brew install numpyが失敗するのでpip3でインストールしておく。

4. brew tap homebrew/science

5. brew edit opencv
opencvのFormulaを変更する。

class Opencv < Formula
  homepage "http://opencv.org/"
  head "https://github.com/Itseez/opencv.git"

  stable do
    url "https://github.com/Itseez/opencv/archive/2.4.10.1.tar.gz"
    sha256 "1be191790a0e279c085ddce62f44b63197f2801e3eb66b5dcb5e19c52a8c7639"
    # do not blacklist GStreamer
    # https://github.com/Itseez/opencv/pull/3639
    patch :DATA
  end

  bottle do
    root_url "https://downloads.sf.net/project/machomebrew/Bottles/science"
    sha1 "ccc506ef6cf339048d21c4ef3d8995c76706c9d9" => :yosemite
    sha1 "fc69f870b36504f271dfe42deb5cb27c49bf21cd" => :mavericks
    sha1 "1726a921ced13ebe7f2df0f18f64997091070f71" => :mountain_lion
  end

  devel do
    url "https://github.com/Itseez/opencv/archive/3.0.0-beta.tar.gz"
    sha1 "560895197d1a61ed88fab9ec791328c4c57c0179"
    version "3.0.0-beta"
  end

  option "32-bit"
  option "with-java", "Build with Java support"
  option "with-qt", "Build the Qt4 backend to HighGUI"
  option "with-tbb", "Enable parallel code in OpenCV using Intel TBB"
  option "without-tests", "Build without accuracy & performance tests"
  option "without-opencl", "Disable GPU code in OpenCV using OpenCL"
  option "with-cuda", "Build with CUDA support"
  option "with-quicktime", "Use QuickTime for Video I/O insted of QTKit"
  option "with-opengl", "Build with OpenGL support"
  option "without-brewed-numpy", "Build without Homebrew-packaged NumPy"

  option :cxx11

  depends_on :ant if build.with? "java"
  depends_on "cmake"      => :build
  depends_on "eigen"      => :recommended
  depends_on "gstreamer"  => :optional
  depends_on "gst-plugins-good" if build.with? "gstreamer"
  depends_on "jasper"     => :optional
  depends_on :java        => :optional
  depends_on "jpeg"
  depends_on "libpng"
  depends_on "libtiff"
  depends_on "libdc1394"  => :optional
  depends_on "openexr"    => :recommended
  depends_on "openni"     => :optional
  depends_on "pkg-config" => :build
  depends_on "qt"         => :optional
  depends_on "tbb"        => :optional

  depends_on :python      => :recommended
  depends_on "homebrew/python/numpy" if build.with? "brewed-numpy"

  # Can also depend on ffmpeg, but this pulls in a lot of extra stuff that
  # you don't need unless you're doing video analysis, and some of it isn't
  # in Homebrew anyway. Will depend on openexr if it's installed.
  depends_on "ffmpeg" => :optional

  def arg_switch(opt)
    (build.with? opt) ? "ON" : "OFF"
  end

  def install
    ENV.cxx11 if build.cxx11?
    jpeg = Formula["jpeg"]
    dylib = OS.mac? ? "dylib" : "so"
    py_ver = build.stable? ? "" : "3"

    args = std_cmake_args + %W[
      -DCMAKE_OSX_DEPLOYMENT_TARGET=
      -DBUILD_ZLIB=OFF
      -DBUILD_TIFF=OFF
      -DBUILD_PNG=OFF
      -DBUILD_OPENEXR=OFF
      -DBUILD_JASPER=OFF
      -DBUILD_JPEG=OFF
      -DJPEG_INCLUDE_DIR=#{jpeg.opt_include}
      -DJPEG_LIBRARY=#{jpeg.opt_lib}/libjpeg.#{dylib}
    ]
    args << "-DBUILD_TESTS=OFF" << "-DBUILD_PERF_TESTS=OFF" if build.without? "tests"
    args << "-DBUILD_opencv_python#{py_ver}=" + arg_switch("python")
    args << "-DBUILD_opencv_java=" + arg_switch("java")
    args << "-DWITH_OPENEXR="   + arg_switch("openexr")
    args << "-DWITH_EIGEN="     + arg_switch("eigen")
    args << "-DWITH_TBB="       + arg_switch("tbb")
    args << "-DWITH_FFMPEG="    + arg_switch("ffmpeg")
    args << "-DWITH_QUICKTIME=" + arg_switch("quicktime")
    args << "-DWITH_1394="      + arg_switch("libdc1394")
    args << "-DWITH_OPENGL="    + arg_switch("opengl")
    args << "-DWITH_JASPER="    + arg_switch("jasper")
    args << "-DWITH_QT="        + arg_switch("qt")
    args << "-DWITH_GSTREAMER=" + arg_switch("gstreamer")

    if build.with? "python"
      py_prefix = `/usr/local/bin/python#{py_ver}-config --prefix`.chomp
      py_lib = OS.linux? ? `/usr/local/bin/python#{py_ver}-config --configdir`.chomp : "#{py_prefix}/lib"
      args << "-DPYTHON#{py_ver}_LIBRARY=#{py_lib}/libpython3.4m.#{dylib}"
      args << "-DPYTHON#{py_ver}_INCLUDE_DIR=#{py_prefix}/include/python3.4m"
    end

    if build.with? "cuda"
      ENV["CUDA_NVCC_FLAGS"] = "-Xcompiler -stdlib=libstdc++; -Xlinker -stdlib=libstdc++"
      inreplace "cmake/FindCUDA.cmake",
        "list(APPEND CUDA_LIBRARIES -Wl,-rpath \"-Wl,${_cuda_path_to_cudart}\")",
        "#list(APPEND CUDA"
      args << "-DWITH_CUDA=ON"
      args << "-DCMAKE_CXX_FLAGS=-stdlib=libstdc++"
    else
      args << "-DWITH_CUDA=OFF"
    end

    # OpenCL 1.1 is required, but Snow Leopard and older come with 1.0
    args << "-DWITH_OPENCL=OFF" if build.without?("opencl") || MacOS.version < :lion

    if build.with? "openni"
      args << "-DWITH_OPENNI=ON"
      # Set proper path for Homebrew's openni
      inreplace "cmake/OpenCVFindOpenNI.cmake" do |s|
        s.gsub! "/usr/include/ni", "#{Formula["openni"].opt_include}/ni"
        s.gsub! "/usr/lib", "#{Formula["openni"].opt_lib}"
      end
    end

    if build.include? "32-bit"
      args << "-DCMAKE_OSX_ARCHITECTURES=i386"
      args << "-DOPENCV_EXTRA_C_FLAGS='-arch i386 -m32'"
      args << "-DOPENCV_EXTRA_CXX_FLAGS='-arch i386 -m32'"
    end

    if ENV.compiler == :clang && !build.bottle?
      args << "-DENABLE_SSSE3=ON" if Hardware::CPU.ssse3?
      args << "-DENABLE_SSE41=ON" if Hardware::CPU.sse4?
      args << "-DENABLE_SSE42=ON" if Hardware::CPU.sse4_2?
      args << "-DENABLE_AVX=ON" if Hardware::CPU.avx?
    end

    mkdir "macbuild" do
      system "cmake", "..", *args
      system "make"
      system "make", "install"
    end
  end

  test do
    Language::Python.each_python(build) do |python, _version|
      system python, "-c", "import cv2"
    end
  end
end


__END__
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1d7d78a..1e92c52 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -135,7 +135,7 @@ OCV_OPTION(WITH_NVCUVID        "Include NVidia Video Decoding library support"
 OCV_OPTION(WITH_EIGEN          "Include Eigen2/Eigen3 support"               ON)
 OCV_OPTION(WITH_VFW            "Include Video for Windows support"           ON   IF WIN32 )
 OCV_OPTION(WITH_FFMPEG         "Include FFMPEG support"                      ON   IF (NOT ANDROID AND NOT IOS))
-OCV_OPTION(WITH_GSTREAMER      "Include Gstreamer support"                   ON   IF (UNIX AND NOT APPLE AND NOT ANDROID) )
+OCV_OPTION(WITH_GSTREAMER      "Include Gstreamer support"                   ON   IF (UNIX AND NOT ANDROID) )
 OCV_OPTION(WITH_GSTREAMER_0_10 "Enable Gstreamer 0.10 support (instead of 1.x)"   OFF )
 OCV_OPTION(WITH_GTK            "Include GTK support"                         ON   IF (UNIX AND NOT APPLE AND NOT ANDROID) )
 OCV_OPTION(WITH_IMAGEIO        "ImageIO support for OS X"                    OFF  IF APPLE )
  • 変更場所は、build.stableじゃない時のPythonのバージョンを3に
  • python-configの代わりに/usr/local/bin/python3-configを使用
  • PYTHON3_LIBRARYとPYTHON3_INCLUDE_DIRのパスをそれなりに合わせる

6. brew install opencv --devel --without-brewed-numpy

かなりやっつけ仕事ですが、これで、/usr/local/bin/python3からimport cv2ができるようになりました。