2009年03月27日

OpenCV 画像を読み込みネガポジ反転して表示する.

これは OpenCV 超初心者である私のメモです.
間違っている可能性がありますので注意してください.

cvNot 関数を使用すると画像配列の各要素のビットをすべて反転することができる. これを利用すると画像のネガポシ反転を行うことができる.

OpenCV を使用して, 画像を読み込み, ネガポシ反転して表示するサンプルコードを以下に示す.

ソースコード

/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <cv.h>
#include <highgui.h>

/* main */
int main(void) {
    IplImage *image;

    /* 静止画像を読み込む */
    image = cvLoadImage("dede.jpg",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
    if(image == NULL){
        fprintf(stderr, "読み込み失敗");
        return EXIT_FAILURE;
    }

    /* 配列の各要素のビットをすべて反転する */
    cvNot(image, image);

    /* ウインドウを準備して画像を表示する */
    cvNamedWindow("NegaPosi",CV_WINDOW_AUTOSIZE);
    cvShowImage("NegaPosi",image);

    /* キー入力があるまで待つ */
    cvWaitKey(0); /* これがないと、1瞬だけ表示されて終わる */

    /* メモリを開放する */
    cvReleaseImage(&image);

    /* ウィンドウを破棄する */
    cvDestroyWindow("NegaPosi");

    return EXIT_SUCCESS;
}

実行結果

実行結果は以下のようになる.

dede_negaposi.jpg
タグ:OpenCV C言語
posted by Kojo Sugita at 01:45| Comment(0) | OpenCV | このブログの読者になる | 更新情報をチェックする

2009年03月23日

OpenCV 画像を読み込み2値化して表示する.

これは OpenCV 超初心者である私のメモです.
間違っている可能性がありますので注意してください.

OpenCV を使用して, 画像を読み込み, 2値化して表示するサンプルコードを以下に示す.

ソースコード

/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <cv.h>
#include <highgui.h>
#include <cxcore.h>

/* main */
int main(void) {
    IplImage* source;
    IplImage* binary;

    int threshold = 128;
    int max_value = 255;

    /* 静止画像をグレースケールとして読み込む */
    source = cvLoadImage("dede.jpg",CV_LOAD_IMAGE_GRAYSCALE);
    if (source == NULL) {
        fprintf(stderr, "読込みに失敗しました.");
        return EXIT_FAILURE;
    }

    /* 2値画像用の領域を確保 */
    binary = cvCreateImage(cvGetSize(source), IPL_DEPTH_8U,1); 

    /* グレースケールから2値画像に変換 */
    cvThreshold(source,binary,threshold,max_value,CV_THRESH_BINARY);

    /* ウインドウを準備して画像を表示する */
    cvNamedWindow("Binarization",CV_WINDOW_AUTOSIZE);
    cvShowImage("Binarization",binary);

    /* キー入力があるまで待つ */
    cvWaitKey(0); /* これがないと、1瞬だけ表示されて終わる */

    /* メモリを開放する */
    cvReleaseImage(&source);
    cvReleaseImage(&binary);

    /* ウィンドウを破棄する */
    cvDestroyWindow("Binarization");

    return EXIT_SUCCESS;
}

実行結果

実行結果は以下のようになる.

dede_binarization.jpg
タグ:C言語 OpenCV
posted by Kojo Sugita at 22:35| Comment(0) | OpenCV | このブログの読者になる | 更新情報をチェックする

2009年03月21日

OpenCV 画像を読み込みグレースケールで表示する.

これは OpenCV 超初心者である私のメモです.
間違っている可能性がありますので注意してください.

OpenCV を使用して, 画像を読み込み, グレースケール表示するサンプルコードを以下に示す.

方法1
cvLoadImage 関数で画像を読み込む際に, フラグにCV_LOAD_IMAGE_GRAYSCALEを指定する.

ソースコード

/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <cv.h>
#include <highgui.h>

/* main */
int main(void) {
    IplImage* image;

    /* 静止画像をグレースケールとして読み込む */
    image = cvLoadImage("dede.jpg",CV_LOAD_IMAGE_GRAYSCALE);
    if (image == NULL) {
        fprintf(stderr, "読込みに失敗しました.");
        return EXIT_FAILURE;
    }

    /* ウインドウを準備して画像を表示する */
    cvNamedWindow("Grayscale01",CV_WINDOW_AUTOSIZE);
    cvShowImage("Grayscale01",image);

    /* キー入力があるまで待つ */
    cvWaitKey(0); /* これがないと、1瞬だけ表示されて終わる */

    /* メモリを開放する */
    cvReleaseImage(&image);

    /* ウィンドウを破棄する */
    cvDestroyWindow("Grayscale01");

    return EXIT_SUCCESS;
}

方法2
読み込んだ画像をcvCvtColor 関数でグレースケールに変換する.

ソースコード

/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <cv.h>
#include <highgui.h>

/* main */
int main(void) {
    IplImage *source;
    IplImage *gray;

    /* 静止画像を読み込む */
    source = cvLoadImage("dede.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);
    if(source == NULL){
        fprintf(stderr, "読込みに失敗しました.");
        return EXIT_FAILURE;
    }

    /* グレースケール画像用にメモリを確保 */
    gray = cvCreateImage(cvGetSize(source), IPL_DEPTH_8U,1);

    /* カラー画像をグレースケールに変換 */
    cvCvtColor(source,gray,CV_BGR2GRAY);

    /* ウインドウを準備して画像を表示する */
    cvNamedWindow("Grayscale02",CV_WINDOW_AUTOSIZE);
    cvShowImage("Grayscale02",gray);

    /* キー入力があるまで待つ */
    cvWaitKey(0); /* これがないと、1瞬だけ表示されて終わる */

    /* メモリを開放する */
    cvReleaseImage(&gray);

    /* ウィンドウを破棄する */
    cvDestroyWindow("Grayscale02");

    return EXIT_SUCCESS;
}

実行結果

実行結果は以下のようになる.

dede_grauscale.jpg
タグ:C言語 OpenCV
posted by Kojo Sugita at 17:46| Comment(0) | OpenCV | このブログの読者になる | 更新情報をチェックする

2009年03月18日

OpenCV 画像を読み込み表示する.

これは OpenCV 超初心者である私のメモです.
間違っている可能性がありますので注意してください.

OpenCV を使用して, 画像を読み込み表示するサンプルコードを以下に示す.

ソースコード

/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <cv.h>
#include <highgui.h>

/* main */
int main(void) {
    IplImage* image;

    /* 静止画像を読み込む */
    image = cvLoadImage("dede.jpg",CV_LOAD_IMAGE_ANYCOLOR);
    if (image == NULL) {
        fprintf(stderr, "読込みに失敗しました.");
        return EXIT_FAILURE;
    }

    /* ウインドウを準備して画像を表示する */
    cvNamedWindow("Image",CV_WINDOW_AUTOSIZE);
    cvShowImage("Image",image);

    /* キー入力があるまで待つ */
    cvWaitKey(0); /* これがないと、1瞬だけ表示されて終わる */

    /* メモリを開放する */
    cvReleaseImage(&image);

    /* ウィンドウを破棄する */
    cvDestroyWindow("Image");

    return EXIT_SUCCESS;
}

実行結果

実行結果は以下のようになる.

dede.jpg
タグ:OpenCV C言語
posted by Kojo Sugita at 19:57| Comment(0) | OpenCV | このブログの読者になる | 更新情報をチェックする

2008年11月23日

カラースキームを修正した

ユーザーの方から、 「cursorlineがONの状態で、rootwater.vimを使うとコメント行が見づらい」という、 ご指摘を頂いたので確認したところ、CursorLineが見事に設定されてなかったため、 以下のカラースキームを修正しました。
タグ:vim
posted by Kojo Sugita at 00:51| Comment(0) | Vim | このブログの読者になる | 更新情報をチェックする

2008年11月12日

何故駄目なのか?

C言語で配列に配列を代入するのは何故駄目なのか

C言語で配列に配列を代入すると、コンパイルエラーが発生します。例えば以下のコードをgccでコンパイルしようとすると、"incompatible types in assignment"というエラーが発生します。

1     /* header files */
2     #include <stdlib.h>
3     #include <stdio.h>
4     
5     /* main */
6     int main (int argc, char *argv[]) {
7         char c1[] = "afa";
8         char c2[4];
9     
10        c2 = c1;
11        
12        return EXIT_SUCCESS;
13    }
|10| error: incompatible types in assignment

"incompatible types in assignment"とは、"互換性のない型に代入をしようとしている"という内容のエラーです。 char型の配列に、同じchar型の配列を代入しようしているのに互換性のない型だと怒られる。これは奇妙な話です。

何故駄目なのか

その理由を理解するためには、まず、C言語の右辺値と左辺値を知る必要があります。

右辺値と左辺値

例えば次のようなコードがあったとします。
int x = 100;
x = x + 1;

初心に返って考えると、これはxという箱の中に入っている値を+1して、その結果をxという箱に格納するコードです。 つまり、左辺のx(左辺値)はxという箱を表し、右辺のxは100という値を表しているわけです。 これを一般化してまとめると以下のようになります。

  • 左辺値: 変数の領域そのものを表す
  • 右辺値: 変数の中身表す

lr.png

配列の格下げ規則

さて、本題の配列についてですが、配列の右辺値と左辺値は、普通の変数のそれとは少し異なります。 結論からいってしまえば、配列の左辺値は、配列の領域全体を意味し、 右辺値は、配列の先頭要素の置かれてる領域を意味します。 これを図で表すと以下のようになります。

array.png

配列は右辺値になると、配列から「配列の先頭要素の置かれてる領域」という意味に格下げになります。 これを配列の格下げ規則といいます。

配列に配列を代入するのは何故駄目なのか(結論)

配列の格下げ規則によって、配列の領域全体を表す変数に配列の先頭領域を格納しようとしてしまいます。 これによって、「互換性のない型に代入しようとしているよ」とコンパイラに怒られるというわけです。

aina.png
タグ:C言語
posted by Kojo Sugita at 19:19| Comment(0) | 何故駄目なのか? | このブログの読者になる | 更新情報をチェックする

2008年10月26日

Vimpiを使ってみた

vimプラグインの更新ウォッチサービスVimpiを使ってみました。
9月に登録だけしてずっと放ってたんですが、いざ使ってみるとなかなかに良さげなサービスです。
他の人がどのプラグインをチェックしているのかが分かるのもよいです。
登録するときにユーザー名に半角スペースを入れてしまったことをちょっと後悔していますが、まあ、しょうがないです。
タグ:vim
posted by Kojo Sugita at 19:52| Comment(0) | Vim | このブログの読者になる | 更新情報をチェックする

2008年10月09日

Vim カラースキーマdarkeclipse.vimをつくった

Eclipseの色合いを模倣+背景を黒にしてみました。

darkeclipse.vim
darkeclipse_c.png
darkeclipse.vim
なんだか最近、Vimのカラースキーマを紹介するだけのブログになりつつある気がするなあ・・・
タグ:vim
posted by Kojo Sugita at 00:02| Comment(0) | Vim | このブログの読者になる | 更新情報をチェックする

2008年09月29日

ふと思ったこと

MIT: マサチューセッツ工科大学
IIT: インド工科大学
KIT: 九州工業大学
NIT: 名古屋工業大学
KIT: 金沢工業大学
TIT: 乳首

だから東工大は英語名がTokyo Techなのか!
posted by Kojo Sugita at 21:40| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2008年09月24日

Vim カラースキーマwin9xblueback.vimをつくった

VimがWindows9xのブルーバックスクリーンぽくなるカラースキーマ

win9xblueback.vim
win9xblueback_c.png
win9xblueback.vim

タグ:vim
posted by Kojo Sugita at 23:55| Comment(0) | Vim | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。