2013/10/29

OpenCVでMatとIplImageの相互変換

題目のとおりですが,
下のサイトの通りにやったら出来ました.

[C++/OpenCV] cv::MatとIplImageの相互変換|プログラミング備忘録+その他いろいろなブログ
http://ameblo.jp/ns-programming-memo/entry-11229431837.html

UbuntuでSunJava6を使う

ある事情でOpenJDKなどではなく,SunJava6をインストールしないといけない状況が出てきたのですが,

SunJava6ももう古く,あまり情報もありません.
いろいろ試したところ,
もしもインストールしたい時は下に示すような作業を行うといいです.

これはUbuntu10.04,Ubuntu12.04での動作を確認しています.

まず下記サイトからダウンロードします.
flexiondotorg/oab-java6 · GitHub
https://github.com/flexiondotorg/oab-java6

git clone https://github.com/flexiondotorg/oab-java6.git
cd oab-java6
sudo ./oab-java.sh
sudo apt-get update
sudo apt-get install sun-java6-jdk sun-java6-jre sun-java6-plugin

これでおkです.
synapticでSunJava6のやつを全部インストールしてもいいかもしれません.

次は,SunJava6をJavaのデフォルトにします.
これをしないと,もし他のJavaが入っていた時には,SunJava6を入れても他のやつがデフォルトになってしまっている可能性があるためです.

sudo update-alternatives --config java
sudo update-alternatives --config javac

java -version

うえの2つのコマンドがデフォルトを指定するコマンドです.
したのやつはJavaのバージョンを表示するものですが.これではいっているJavaの確認もすることが出来ます.
こんな感じに出てきたら,SunJava6がデフォルトになっているということです.

 java -version

java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

ここに"OpenJDK"とか書いてあったらデフォルトの指定のコマンドをもう一度実行してデフォルトを変えてください.

これでおkです.


C++で"count"という変数が使えない!?

C++でプログラミングしていたときになんかにか"count"という変数を定義して,使っていると

undeclared (first use this function)

error: reference to ‘count’ is ambiguous

とエラーになってしまうことがあった.
訳すと「曖昧だ」や「多義だ」というように取れる.
また,"count"を"count2"など他の変数名にするとエラーが起きないので間違いなく"count"という名前がだめらしい.

チョットぐぐってみると
Cygwinでg++がグローバル関数をはじいてしまう | C・C++のQ&A【OKWave】
http://okwave.jp/qa/q5368929.html

count
ではなく
::count
とすればいいと書いてある.
多分,なんかでcountが使われてて
使うと多義になっちゃうからエラーが出るのかな.

OpenCV使ってたからそこでなったんだろうか.

2013/10/28

g++のインクルードパスやライブラリのパスを見る

g++の現在のインクルードパスやライブラリパスを調べたいということがあるのですが、
そのような時はこちらのサイトを参考にするといいとおもいます。

http://takuya-1st.hatenablog.jp/entry/20120920/1348511712

とてもわかりやすいですが、ライブラリパスを表示する時のrubyのプログラムの部分が理解できていないので、
今度解読して、勉強のためbashにでも直してみたいと思っています。

UbuntuにOpenCV2.3.1をmakeしてインストール

################################################
#結果的にOpenCV2.3.1をUbuntu10.04にインストールすると,
#VIDIOC_DQBUF: 入力/出力エラーです
#libv4l2: error converting / decoding frame data: v4l-convert: error parsing JPEG header: Not a JPG file ?
#というようなエラーが出たり,あまりうまく行かなかったので,
#かわりにOpenCV2.2をインストールして見ましたが,こちらは特に問題はないようです.
#OpenCV2.2のインストールも下記の方法と同じようにして入れることができます.
################################################

UbuntuにOpenCVをapt-getではなく、makeしてインストールします。

Ubuntuは10.04、OpenCVは2.3.1を使います。

まずは、必要そうなものをapt-getでインストールします。
実際にインストールしたのは、下のサイトで意んんストールしているものをかたっぱしからインストールしてみました。

http://tai1-mo.blogspot.jp/2011/08/opencv231-for-ubuntu1004.html
http://www.kkaneko.com/rinkou/opencv/opencvinstalllinux.html
http://www.mori-soft.com/2008-08-15-01-36-37/opencv/90-opencv-21

そして、OpenCVをダウンロードしてきます。
http://opencv.org/downloads.html

今回はMakefileをつくるためにccmakeを使うので、ccmakeをインストールします。
(cmakeでも別にいいです。)
sudo apt-get install cmake-curses-gui

tar xvf OpenCV-2.3.1a.tar.bz2
cd OpenCV-2.3.1
mkdir build
cd build
ccmake ..

としてConfig画面を出します。
何をどのように設定したのかは、さっきのサイトをみて、いりそうなやつを設定してみました。

make -j 4
sudo make install

でおkです。
これで入ったら、
/usr/local/include
にヘッダーが、
/usr/local/lib
にライブラリが入ります。

エラーがでたらその都度対応して、出なくなったら、サンプルを実行してみます。
それもおkなら、下記のサイトでカメラとかいらなそうなサンプルを持ってきてコンパイルできるかどうか試します。

http://book.mycom.co.jp/support/pc/opencv2/c3/opencv_img.html

コンパイルするときのオプションは次のようにします。
g++ -I/usr/local/include/opencv -L/usr/local/lib -lopencv_highgui -lopencv_core main.cpp

`pkg-config --cflags --libs opencv`とかしてしまうと、apt-getで入っている方のOpenCVが当てられてしまうので注意です。

しかし、この様にすると、自分はこの様なエラーになってしまいました。 

error while loading shared libraries: libopencv_highgui.so.2.3: cannot open shared object file: No such file or directory

ライブラリのpathを-Lで設定しているのに見つけていないようです。

これはこのサイトをみて解決しました。
http://www.ozbotz.org/opencv-install-troubleshooting/ 

echo "LD_LIBRARY_PATH=/usr/local/lib" >> ~/.bashrc
 
これで環境は整いました。 
 

2013/10/27

HTMLでタグの<や>をエスケープする方法

HTMLにプログラムを書くと
<, >
がかけなくて困る時があります.

そんな時にはエスケープしてプログラムに文字として表示して欲しいという事を明示します.

つまり,次のように書き換えればいい訳です.
<   ==>   &lt;
>   ==>   &gt;

例えば,
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

と書きたい時には
#include &lt;opencv2/core/core.hpp&gt;
#include &lt;opencv2/highgui/highgui.hpp&gt;

と書けばいいです.

OpenCVでfillConvexPolyを使って四角形や多角形を描画する

OpeCVの2.xのお話ですが,

OpenCVで任意の四角形や多角形を描画するときにはポリゴンを使って頂点をつなげて描画するみたいです.

初めは下記ので書かれている
cv::fillPoly
を使って書こうと思ったのですが,

描画処理 — OpenCV-CookBook
http://opencv.jp/cookbook/opencv_drawing.html

下記のサイトのfillPolyを見てみると,引数は次のように書かれています.
描画関数 — opencv v2.1 documentation
http://opencv.jp/opencv-2.1/cpp/drawing_functions.html

void fillPoly(Mat& img, const Point** pts, const int* npts, int ncontours, const Scalar& color, int lineType=8, int shift=0, Point offset=Point())

特に2個目の"Point**"とか渡さないといけなくて,なんか変だなと思っていました.

そしてなんとなく上の方を見てみると"fillConvexPoly"というのを見つけました.

void fillConvexPoly(Mat& img, const Point* pts, int npts, const Scalar& color, int lineType=8, int shift=0)

これだとPoint*を渡せばいいのでわかりやすいです.
また,「fillPolyよりも高速で動作する」とも書いています.
勝手に塗りつぶされるのがたまにキズですが,今回は塗りつぶされてもいいのでこれを使います.

"fillConvexPoly"を使ったサンプルプログラムを探したのですが,見つからなかったので,
自分で書きます.

/*****************************************************
    C++  のプログラム(Python版は下に書きます)
******************************************************/

次にプログラムを載せますが,
カメラで画像を取得して適当な4つの点を結ぶ四角形を描画します.
下のは四角形ですが,配列を増やせば多角形もいけます.


#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int main(int argc, char *argv[])
{
  cv::VideoCapture cap(0);
  cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
  cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
  
  // カメラがオープンできたかの確認
  if(!cap.isOpened()) return -1;
  cv::namedWindow("Capture", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);

  while(1) {
    cv::Mat frame;
    cap >> frame;


    cv::Point pt[4]; //任意の4点を配列に入れる
    pt[0] = cv::Point(100, 100);
    pt[1] = cv::Point(150, 200);
    pt[2] = cv::Point(300, 300);
    pt[3] = cv::Point(400, 100);

    //描画 引数は (画像, 点の配列, 点の数, 色)
    cv::fillConvexPoly( frame, pt, 4, cv::Scalar(0,0,200) ); 
    
    cv::imshow("Capture", frame);
 
    if(cv::waitKey(30) >= 0){
      break;
    }
  }
}


実行結果はこのようになります.




#####################################
#   2015年1月18日 追記
#   コメントでPythonの方のプログラムのリクエストがあったので書きます。
#   Python のプログラム
#####################################
Ubuntu14.04
Python 2.7.6 , python-opencv 2.4.8
で確認しました。

引数などを確認すると
Drawing Functions — OpenCV 2.4.9.0 documentation
http://docs.opencv.org/modules/core/doc/drawing_functions.html#void%20fillPoly(Mat&%20img,%20const%20Point**%20pts,%20const%20int*%20npts,%20int%20ncontours,%20const%20Scalar&%20color,%20int%20lineType,%20int%20shift,%20Point%20offset)

cv2.fillConvexPoly(img, points, color[, lineType[, shift]])

となっています。
同じようにカメラ画像から取得した画像にfillConvexPolyで多角形を描画します。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cv2
import numpy as np

def main():
    cap = cv2.VideoCapture(0)

    while(True):
        #カメラのキャプチャからフレームを取得する
        ret, frame = cap.read()
        #多角形を記述
        contours = np.array( [ [100,100], [100,230], [230, 250], [150,70] ] )
        #fillConvexPolyで多角形を描画
        cv2.fillConvexPoly(frame, points =contours, color=(0,0,255))

        cv2.imshow('Camera Capture', frame)

        #何かキーを押したら終了
        if cv2.waitKey(10) > 0:
            cap.release()
            cv2.destroyAllWindows()
            break

if __name__ == '__main__':
    main()

実行するとこのようになります。
これでおkです。






OpenCVをg++でコンパイルするときのオプション

OpenCVでC++ファイルをコンパイルするときにオプションをよく忘れてしまうのでメモ

g++ `pkg-config --cflags --libs opencv` main.cpp

使うときはこれをコピーしよう

2013/10/25

ShapeCollageを使って大量の画像を自動レイアウト

これまで撮った写真をおしゃれに配置して,一枚の写真を作りたかったのですが,
そのような場合にピッタリなソフトがありました.

Shape Collage - Automatic Photo Collage Maker
http://www.shapecollage.com/

公式の画像にあるように,おしゃれに配置してくれます.

ダウンロード方法とちょっとした使い方を説明します.

今回使ったところ,現在の最新版のVer2.5.3では,
日本語対応などいろいろ改良されていいところがあるのですが,
配置した画像中にロゴが入ってしまいました.

できればロゴは入ってほしくないのですが,
「Ver2.1ならロゴが入らない」という情報があるので,今回はちょっと古いVer2.1をインストールします.

まず,インストーラーをダウンロードします.

ShapeCollage-2.1-Setup
http://www.mediafire.com/download/dwzmmzjmden/ShapeCollage-2.1-Setup.exe

使い方は下のサイトが詳しいです.

コラージュの作成方法
http://itfutaba.hp2.jp/i/00IT-Futaba/Manual/collage/New/guide.htm
唯一,これ通りにいかなかったのは,
画像の追加をドラック&ドロップですることができず,「+」ボタンで追加したくらいです.

#2013.10.27追記
#再度行ったところ,ドラック&ドロップでも画像を追加出来ました.
#これで参考のサイトと全く同様に出来ます.

これでおしゃれに写真をレイアウトできました.

ページビューが100,000を超えたので人気の記事を調べて見ました.

今見たところ,ページビューの数が100,000を超えていました.

こんなブログを見てくれて有難うございます.

記念して,人気のある記事のランキングを載せてみようと思います.


1位
○○○○に怖いものなんてない!!: mp4とm4vの違い
http://kowaimononantenai.blogspot.jp/2012/09/mp4m4v.html

なんとなく書いた記事なのですが,ぶっちぎりで1位ですね.
やっぱりみんな疑問に思っていたのかもしれません.


2位
○○○○に怖いものなんてない!!: Ubuntu13.10の標準プラウザの議論が続く
http://kowaimononantenai.blogspot.jp/2013/06/ubuntu1310.html



これは英語の記事を翻訳したものです.
このような需要もありそうだとわかったので,もっと力を入れていきたいと思います.

3位
○○○○に怖いものなんてない!!: STM32F4-Discoveryの開発環境構築 (EWARM)
http://kowaimononantenai.blogspot.jp/2012/10/stm32f4-discovery-ewarm.html

次はARMマイコンについてです.
ただ開発環境を整えただけですが.

4位
○○○○に怖いものなんてない!!: USBメモリの無料データ復元ソフト
http://kowaimononantenai.blogspot.jp/2012/08/usb.html

これは実際に試してみて,いいものを調べた記事なので,
それなりに高く,良かったです.

5位
○○○○に怖いものなんてない!!: Processingの日本語文字化け解決法
http://kowaimononantenai.blogspot.jp/2013/07/processing.html



これも,案外簡単に解決したものなので,
こんなに高いとは思っていませんでした.


まあ,100,000ビューではこんなかんじでした.
個人的には
○○○○に怖いものなんてない!!: Ubuntu12.04をusb3.0でブート
http://kowaimononantenai.blogspot.jp/2012/08/ubuntu1204usb30.html

あたりが頑張った記事なので,高いと嬉しかったのですが,
そう単純には行かないようですね.

2013/10/15

Ubuntuを起動した時に「vesamenu.c32: not a COM32R image」となったら

Ubuntu10.04のUSBインストーラーを起動したところ,

「vesamenu.c32: not a COM32R image」

となってしまい,OSが起動しなくなってしまいました.

これを直すには,
他のUbuntuでUSBをマウントして,
syslinux/syslinux.cfg


default vesamenu.c32
を
default live
直せば大丈夫です.

参考にしたサイト
Ubuntu(or LinuxMint)上でLinuxMint12 64bitのUSB起動ディスクを作成する - TrinityT’s LABO
http://d.hatena.ne.jp/TrinityT/20120212/1329032660

2013/10/12

Ubuntu10.04でVim7.3を使う

いまでも諸事情でUbuntu10.04も使っているのですが,
デフォルトでは10.04のVIMは7.2なので,もう少しバージョンが高い7.3を使えるようにします.

PPAで追加するだけです.
sudo add-apt-repository ppa:infie/vim-lucid
sudo apt-get update
sudo apt-get install vim

以下のサイトに詳しいことは書いていますが,oneiricのvimをlucidにバックポートしたものらしいです.
VIM lucid backports : Maarten Rijke
https://launchpad.net/~infie/+archive/vim-lucid

これでちょっと新しいvimを使えます.

2013/10/10

セーフモードのコマンドフロンプトでユーザーを追加する

ちょっとPCがおかしくなったので,自分のユーザーのファイルを丸ごとバックアップしたかったのだが,
ログオンしているユーザー自身のユーザーのファイルはなにかと使用中であることが多いので,
別にアカウントをつくって,コピーしたほうがいい.

現時点ではセーフモードでないとログインできない状態なので,
「セーフモードでユーザーを作る」方法を書きます.

1)
起動するときに「F8」を押す.

「セーフモードとコマンドプロンプト」を選択して起動させる.

2)
コマンドプロンプトが出てきたら,
net user <作成するユーザー名> /add
net localgroup Administrators <作成したユーザー名> /add

でAdministratorのユーザーを作ることができます.
で,リブート
shutdown -r -t 5

これでAdministratorのユーザーを追加することができました.

【困っています!】セーフモードでのアカウント作成 - Yahoo!知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1062375395

2013/10/03

Windows7 64bitでIPythonを使う

最近になってやっとIPythonというPythonの中でも便利なものを見つけました.
よって,WindowsにIPythonをインストールします.

公式に行くとこのようなインストール方法を進められますが,
Installing IPython — IPython
http://ipython.org/install.html

自分はこちらでやりました.

pip と ipython インストール手引き (Windows編) - secretbase.log
http://cointoss.hatenablog.com/entry/20120531/1338474875

こちらの方がpipで入るし,簡単ですね.

Gimp2.8のツールオプションの一部が空欄になってしまうバグが直っている

かなり前ですが,GIMPが2.8.0になった時に,
インストール版だとツールオプションの一部が空白になってしまうというバグがありました.
GIMP2.8のバグ:ツールオプションの設定項目の数値が消える不具合を直す方法。 | GIMP2の使い方
http://gimp2-how-to-use.blogspot.jp/2012/05/gimp28_06.html

まあ,上のURLにもあるように環境変数を指定すれば治るのですが,
環境変数をあまり増やしたくないので,ポータブル版を使っていました.

しかし,ポータブル版も
右クリックー>gimpで編集
がスムーズにできないのでちょっと使いにくかったです.

そして,今HPを見てみるとGIMP2.8.6が最新版になっています.
今あるバグありのばーしょんは2.8.0なので,
「もしかしたらバグが直っているかもしれない」
と思い,インストールしてみたところ,やはりバグが直っていました.

これでスムーズに画像を編集できます.