ページ更新: 2016-12-26 (月) (2230日前)
(2010-04-06) OpenCV (Open Computer Vision Library) についてのメモなど。 目次 概要 #
情報源 #(2012-07-17, 2010-08-16)
Visual Studio 用拡張 #Image Watch:
NativeViewer:
Python 関連 #(2010-04-20)
numpy
PIL
他の言語とのbinding #[編集]OpenCV demonstrator (GUI) (2015-12-19) #[編集]Ceemple (2014-09-05) #
OpenCV 3.x.x #
OpenCV 2.4.x #
OpenCV 2.4.3:
OpenCV 2.4.0:
OpenCV 2.3.x #(2011-07-08)
OpenCV 2.3 ブランチの最近の変更履歴 (2011-07-11時点): C:> svn log -l 8 https://code.ros.org/svn/opencv/branches/2.3/ Error validating server certificate for 'https://code.ros.org:443': - The certificate is not issued by a trusted authority. Use the fingerprint to validate the certificate manually! Certificate information: - Hostname: *.ros.org - Valid: from Thu, 10 Sep 2009 14:16:35 GMT until Tue, 11 Sep 2012 20:05:53 GMT - Issuer: Equifax Secure Certificate Authority, Equifax, US - Fingerprint: fb:45:70:74:bf:12:94:01:05:23:8d:ee:b2:04:66:d0:f8:9a:e8:d2 (R)eject, accept (t)emporarily or accept (p)ermanently? t ------------------------------------------------------------------------ r5901 | vp153 | 2011-07-07 20:36:40 +0900 (木, 07 7 2011) | 1 line a few more fixes from Gabor ------------------------------------------------------------------------ r5893 | vp153 | 2011-07-07 03:45:11 +0900 (木, 07 7 2011) | 1 line possibly fixed problem reported in #1198 ------------------------------------------------------------------------ r5876 | vp153 | 2011-07-05 23:28:25 +0900 (火, 05 7 2011) | 1 line fixed 2 possible build problems (in opencv_gpu & docs) (ticket #1191 + fix from Steve Macao). removed obsolete stuff from opencv_extra_api.hpp, since with Input Array/OutputArray the existing C++ API can be successfully wrapped for Python. ------------------------------------------------------------------------ r5868 | vp153 | 2011-07-05 01:33:54 +0900 (火, 05 7 2011) | 1 line possibly fixed occasional deletion of mymath.sty in the case of in-source builds (though, in-source builds are still not recommended) - ticket #1163. ------------------------------------------------------------------------ r5850 | vp153 | 2011-07-04 12:37:13 +0900 (月, 04 7 2011) | 1 line fixed /incremental linker flag & opencv_ffmpeg.dll target dir in the case of sta tic libs ------------------------------------------------------------------------ r5848 | vp153 | 2011-07-04 09:35:56 +0900 (月, 04 7 2011) | 1 line corrected opencv_ffmpeg.dll copying when the target dir does not exists yet ------------------------------------------------------------------------ r5847 | vp153 | 2011-07-04 08:45:35 +0900 (月, 04 7 2011) | 1 line fix cap_ffmpeg.cpp build when no ffmpeg is found ------------------------------------------------------------------------ r5846 | vp153 | 2011-07-04 08:42:33 +0900 (月, 04 7 2011) | 1 line fix build on Linux/Mac ------------------------------------------------------------------------[編集] OpenCV 2.2.x #(2010-12-13)
OpenCV 2.1.x #
OpenCV 祭り #(2011-03-07)
メモ #[編集]OpenCV で GPGPU を使う (情報のリンクだけ) #(2013-12-13), 聞かれて調べたのでメモしておく。
OpenCV 2.3.0 #[編集]cv::InRange(), cvInRange(), cvInRangeS() の動作が従来と異なるが、マニュアルは従来の仕様のまま → 動作変更は仕様。マニュアルを修正 #(2011-09-20, 2011-12-02, 2011-12-04)
(まだ試していないが) cvInRange, cv::inRange を使ってる箇所は CV_MAJOR_VERSION, CV_MINOR_VERSION, CV_SUBMINOR_VERSION, CV_VERSION を使って分けておくか。 #if (CV_MAJOR_VERSION == 1) || (CV_MAJOR_VRSION == 2 && CV_MINOR_VERSION <= 2) // 古い仕様 #else // 新しい仕様 #endif OpenCV 2.1.0 と 2.3.0 で、cvInRangeS() の動作が異なっている。
従来の動作が仕様に合致していると思う。 なお、この件は、opencv-users | Mailing List Archive や OpenCV Issue Tracker には見当たらないようだ。 再現用コード:
#if 1 // OpenCV 2.1.0 #include <opencv/cv.h> #include <opencv/cvver.h> #else // OpenCV 2.2 or later #include <opencv2/core/core_c.h> #include <opencv2/core/version.hpp> #endif #include <stdio.h> int main(int, char*[]) { printf("CV_VERSION = %s\n", CV_VERSION); CvSize size = cvSize(1, 5); IplImage* src = cvCreateImage(size, IPL_DEPTH_8U, 1); IplImage* dst = cvCreateImage(size, IPL_DEPTH_8U, 1); // 200 ... 204 をセットする for (int y = 0; y < size.height; ++y) { cvSet2D(src, y, 0, cvScalar(200 + y)); } // マニュアルどおりであれば、201<= value < 203 の部分だけ 255 がセットされ、それ以外は 0 がセットされるはず。 cvInRangeS(src, cvScalar(201), cvScalar(203), dst); printf("src: "); for (int y = 0; y < size.height; ++y) { printf("%3d ", (int)cvGet2D(src, y, 0).val[0]); } printf("\n"); printf("dst: "); for (int y = 0; y < size.height; ++y) { printf("%3d ", (int)cvGet2D(dst, y, 0).val[0]); } printf("\n"); cvReleaseImage(&dst); cvReleaseImage(&src); return 0; } 結果: CV_VERSION = 2.1.0 src: 200 201 202 203 204 dst: 0 255 255 0 0 --- CV_VERSION = 2.2.0 src: 200 201 202 203 204 dst: 0 255 255 0 0 --- CV_VERSION = 2.3.0 src: 200 201 202 203 204 dst: 0 255 255 255 0 === CV_VERSION = 2.3.1 src: 200 201 202 203 204 dst: 0 255 255 255 0 === ソースコードリポジトリを調べたところ、modules/core/src/arithm.cpp の チェンジセット 4885 で、この変更が行われていた。 (チェンジセット 4885 以後が含まれるのは、OpenCV 2.3.0 と 2.3.1)
このチェンジセット 4885 は、/branches/2.2 には含まれず、/tags/2.3.0 と /tags/2.3.1 に含まれている。
OpenCV 2.3.1 に含まれるテストコード opencv/modules/core/test/test_arithm.cpp でも、InRange を「a <= v <= b」としてテストしているようだ。 [編集]OpenCV 2.2.0 #(2010-12-26) Windows版のメモ
Python (Windows) #Numpy が必須である。(インストールされていない場合、「import cv」で例外が発生する)
LoadImageでJPEG画像を表示してみた: C:> cd c:\OpenCV2.2\sample\c C:> dir /b *.jpg airplane.jpg baboon.jpg baboon200.jpg baboon200_rotated.jpg cat.jpg fruits.jpg lena.jpg one_way_train_0000.jpg one_way_train_0001.jpg stuff.jpg C:> c:\python27\python Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> >>> import cv >>> help(cv.LoadImage) Help on built-in function LoadImage in module cv: LoadImage(...) LoadImage(filename [, iscolor]) -> None >>> img = cv.LoadImage('cat.jpg') >>> cv.NamedWindow('cat') ★ウィンドウが表示される >>> cv.ShowImage('cat', img) ★ウィンドウが「応答なし」になる >>> cv.WaitKey() ★ウィンドウに画像が表示される 13 ★リターンキーを押した >>> cv.DestroyWindow('cat') >>> ^Z C:>[編集] OpenCV 2.1.0 #[編集]インストール #インストールには OpenCV-2.1.0-win32-vs2008.exe を用いた。 メモ
[編集] Python で画像を読み込んで表示してみる #(2010-04-11) Pytyon で cv モジュールを読み込んでみる……OK(エラーが発生しない): C:\> python -V Python 2.6.5 C:\> python -c "import cv" C:\> 画像を読み込んで、表示してみる……OK: # -*- coding: UTF-8 -*- import cv img = cv.LoadImage('c:/OpenCV2.1/samples/c/lena.jpg') cv.NamedWindow('Example1') cv.ShowImage('Example1', img) cv.WaitKey() cv.DestroyWindow('Example1')[編集] Python のサンプルコードを調べてみる #(2010-04-11) Python用のサンプルコードの実行に必要な物を調べてみる。
C:\OpenCV2.1\samples\python> findstr "import" *.py camera.py:import cv camshift.py:import cv chessboard.py:import cv chessboard.py:import sys chessboard.py:import urllib2 contours.py:# import the necessary things for OpenCV contours.py:import cv convexhull.py:# import the necessary things for OpenCV convexhull.py:import cv convexhull.py:import random cv20squares.py:import math cv20squares.py:import cv cvutils.py:import cv cvutils.py:import urllib2 cvutils.py:from sys import argv delaunay.py:import cv delaunay.py:import random demhist.py:import cv demhist.py:import sys demhist.py:import urllib2 dft.py:import cv dft.py:import sys dft.py:import urllib2 distrans.py:import sys distrans.py:import cv distrans.py:import urllib2 drawing.py:from random import Random drawing.py:import colorsys drawing.py:import cv edge.py:import sys edge.py:import urllib2 edge.py:import cv facedetect.py:import sys facedetect.py:import cv facedetect.py:from optparse import OptionParser fback.py:from cv import * ffilldemo.py:import sys ffilldemo.py:import random ffilldemo.py:import urllib2 ffilldemo.py:import cv fitellipse.py:import sys fitellipse.py:import urllib2 fitellipse.py:import random fitellipse.py:import cv houghlines.py:import sys houghlines.py:from math import sin, cos, sqrt, pi houghlines.py:import cv houghlines.py:import urllib2 inpaint.py:import urllib2 inpaint.py:import sys inpaint.py:import cv kalman.py:import urllib2 kalman.py:import cv kalman.py:from math import cos, sin, sqrt kalman.py:import sys kmeans.py:import urllib2 kmeans.py:import cv kmeans.py:from random import randint laplace.py:import urllib2 laplace.py:import cv laplace.py:import sys lkdemo.py:import sys lkdemo.py:# import the necessary things for OpenCV lkdemo.py:import cv logpolar.py:import sys logpolar.py:import urllib2 logpolar.py:import cv minarea.py:import urllib2 minarea.py:import cv minarea.py:from random import randint minidemo.py:import cv morphology.py:import sys morphology.py:import urllib2 morphology.py:import cv motempl.py:import urllib2 motempl.py:import sys motempl.py:import time motempl.py:from math import cos, sin motempl.py:import cv numpy_array.py:import urllib2 numpy_array.py:import sys numpy_array.py:import cv numpy_array.py:import numpy peopledetect.py:import sys peopledetect.py:from cv import * pyramid_segmentation.py:import cv squares.py:import urllib2 squares.py:from math import sqrt squares.py:import cv watershed.py:import urllib2 watershed.py:import sys watershed.py:import cv URLを調べたところ、画像は全て C:\OpenCV2.1\samples\c\ や C:\OpenCV2.1\doc\pics に存在している。 C:\OpenCV2.1\samples\python> findstr http *.py chessboard.py: url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/left01.jpg' cvutils.py: urlbase = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/' demhist.py: # (http://visca.com/ffactory/archives/5-99/msg00021.html) demhist.py: url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/baboon.jpg' dft.py: url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/baboon.jpg' distrans.py: url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/stuff.jpg' edge.py: url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/fruits.jpg' ffilldemo.py: url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/fruits.jpg' fitellipse.py: url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/stuff.jpg' houghlines.py: url = 'https://code.ros.org/svn/opencv/trunk/opencv/doc/pics/building.jpg' inpaint.py: url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/fruits.jpg' logpolar.py: url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/fruits.jpg' morphology.py: url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/fruits.jpg' numpy_array.py:# SRGB-linear conversions using NumPy - see http://en.wikipedia.org/wiki/SRGB numpy_array.py: url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/lena.jpg' watershed.py: url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/fruits.jpg' 以下のように、urllib.urlopen(url).read() を file(..., 'rb').read() に置き換えると、インターネットへのアクセスなしで動作した。
C:\OpenCV2.1\samples\python> hg diff -U0 diff -r 864a92f4dd8a python/chessboard.py --- a/python/chessboard.py Sun Apr 11 17:07:15 2010 +0900 +++ b/python/chessboard.py Sun Apr 11 17:34:54 2010 +0900 @@ -13,2 +13,1 @@ - url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/left01.jpg' - filedata = urllib2.urlopen(url).read() + filedata = file('../c/left01.jpg', 'rb').read() diff -r 864a92f4dd8a python/demhist.py --- a/python/demhist.py Sun Apr 11 17:07:15 2010 +0900 +++ b/python/demhist.py Sun Apr 11 17:34:54 2010 +0900 @@ -71,2 +71,1 @@ - url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/baboon.jpg' - filedata = urllib2.urlopen(url).read() + filedata = file('../c/baboon.jpg', 'rb').read() diff -r 864a92f4dd8a python/dft.py --- a/python/dft.py Sun Apr 11 17:07:15 2010 +0900 +++ b/python/dft.py Sun Apr 11 17:34:54 2010 +0900 @@ -54,2 +54,1 @@ - url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/baboon.jpg' - filedata = urllib2.urlopen(url).read() + filedata = file('../c/baboon.jpg', 'rb').read() diff -r 864a92f4dd8a python/distrans.py --- a/python/distrans.py Sun Apr 11 17:07:15 2010 +0900 +++ b/python/distrans.py Sun Apr 11 17:34:54 2010 +0900 @@ -45,2 +45,1 @@ - url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/stuff.jpg' - filedata = urllib2.urlopen(url).read() + filedata = file('../c/stuff.jpg', 'rb').read() diff -r 864a92f4dd8a python/edge.py --- a/python/edge.py Sun Apr 11 17:07:15 2010 +0900 +++ b/python/edge.py Sun Apr 11 17:34:54 2010 +0900 @@ -35,2 +35,1 @@ - url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/fruits.jpg' - filedata = urllib2.urlopen(url).read() + filedata = file('../c/fruits.jpg', 'rb').read() diff -r 864a92f4dd8a python/ffilldemo.py --- a/python/ffilldemo.py Sun Apr 11 17:07:15 2010 +0900 +++ b/python/ffilldemo.py Sun Apr 11 17:34:54 2010 +0900 @@ -76,2 +76,1 @@ - url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/fruits.jpg' - filedata = urllib2.urlopen(url).read() + filedata = file('../c/fruits.jpg', 'rb').read() diff -r 864a92f4dd8a python/fitellipse.py --- a/python/fitellipse.py Sun Apr 11 17:07:15 2010 +0900 +++ b/python/fitellipse.py Sun Apr 11 17:34:54 2010 +0900 @@ -86,2 +86,1 @@ - url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/stuff.jpg' - filedata = urllib2.urlopen(url).read() + filedata = file('../c/stuff.jpg', 'rb').read() diff -r 864a92f4dd8a python/houghlines.py --- a/python/houghlines.py Sun Apr 11 17:07:15 2010 +0900 +++ b/python/houghlines.py Sun Apr 11 17:34:54 2010 +0900 @@ -17,2 +17,1 @@ - url = 'https://code.ros.org/svn/opencv/trunk/opencv/doc/pics/building.jpg' - filedata = urllib2.urlopen(url).read() + filedata = file('../../doc/pics/building.jpg', 'rb').read() diff -r 864a92f4dd8a python/inpaint.py --- a/python/inpaint.py Sun Apr 11 17:07:15 2010 +0900 +++ b/python/inpaint.py Sun Apr 11 17:34:54 2010 +0900 @@ -30,2 +30,1 @@ - url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/fruits.jpg' - filedata = urllib2.urlopen(url).read() + filedata = file('../c/fruits.jpg', 'rb').read() diff -r 864a92f4dd8a python/logpolar.py --- a/python/logpolar.py Sun Apr 11 17:07:15 2010 +0900 +++ b/python/logpolar.py Sun Apr 11 17:34:54 2010 +0900 @@ -26,2 +26,1 @@ - url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/fruits.jpg' - filedata = urllib2.urlopen(url).read() + filedata = file('../c/fruits.jpg', 'rb').read() diff -r 864a92f4dd8a python/morphology.py --- a/python/morphology.py Sun Apr 11 17:07:15 2010 +0900 +++ b/python/morphology.py Sun Apr 11 17:34:54 2010 +0900 @@ -34,2 +34,1 @@ - url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/fruits.jpg' - filedata = urllib2.urlopen(url).read() + filedata = file('../c/fruits.jpg', 'rb').read() diff -r 864a92f4dd8a python/numpy_array.py --- a/python/numpy_array.py Sun Apr 11 17:07:15 2010 +0900 +++ b/python/numpy_array.py Sun Apr 11 17:34:54 2010 +0900 @@ -25,2 +25,1 @@ - url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/lena.jpg' - filedata = urllib2.urlopen(url).read() + filedata = file('../c/lena.jpg', 'rb').read() diff -r 864a92f4dd8a python/watershed.py --- a/python/watershed.py Sun Apr 11 17:07:15 2010 +0900 +++ b/python/watershed.py Sun Apr 11 17:34:54 2010 +0900 @@ -30,2 +30,1 @@ - url = 'https://code.ros.org/svn/opencv/trunk/opencv/samples/c/fruits.jpg' - filedata = urllib2.urlopen(url).read() + filedata = file('../c/fruits.jpg', 'rb').read() このパッチを当てるには、patch コマンドを用いる (また、Mercurialに格納しているのであれば、hg patch パッチファイル名」でできる)。以下では Cygwin 1.7.x の patch コマンドを用いている: /cygdrive/c/OpenCV2.1/samples$ patch -p1 < localfile.patch (Stripping trailing CRs from patch.) patching file python/chessboard.py (Stripping trailing CRs from patch.) patching file python/demhist.py (Stripping trailing CRs from patch.) patching file python/dft.py (Stripping trailing CRs from patch.) patching file python/distrans.py (Stripping trailing CRs from patch.) patching file python/edge.py (Stripping trailing CRs from patch.) patching file python/ffilldemo.py (Stripping trailing CRs from patch.) patching file python/fitellipse.py (Stripping trailing CRs from patch.) patching file python/houghlines.py (Stripping trailing CRs from patch.) patching file python/inpaint.py (Stripping trailing CRs from patch.) patching file python/logpolar.py (Stripping trailing CRs from patch.) patching file python/morphology.py (Stripping trailing CRs from patch.) patching file python/numpy_array.py (Stripping trailing CRs from patch.) patching file python/watershed.py numpy をインストールしてみたが、サンプルコード numpy_array.py は TypeError 例外が発生した: C:\OpenCV2.1\samples\python> numpy_array.py Traceback (most recent call last): File "C:\OpenCV2.1\samples\python\numpy_array.py", line 34, in <module n = numpy.asarray(img0) / 255.0 TypeError: unsupported operand type(s) for /: 'cv.cvmat' and 'float'[編集] cvLoadImage のバグ #(2010-06-10) 多少大きめのBMPを読み込めないバグ。クラッシュしたり、異常終了したりする。 (手元だと幅1369以上だったり、幅2825以上だったり)。 要するに、メモリ確保をミスってるようだ…… Valgrid とか electricfence とかで発見できるような気がする。 バグとして登録されてたので、以下のチケットを見て修正して、ライブラリをコンパイルして回避した。
Python SnakeImageのバグ #[編集]OpenCV 2.0.0a #[編集]インストール #メモ
[編集] OpenCV 1.1pre #[編集]インストール #メモ
|