Hatena::Grouptechmemo

USBカメラを使って色々遊ぶ日記(仮)

2008-08-17

netpbmというのをインストール

| 00:34 | netpbmというのをインストール - USBカメラを使って色々遊ぶ日記(仮) を含むブックマーク はてなブックマーク - netpbmというのをインストール - USBカメラを使って色々遊ぶ日記(仮)

PPM/PGM/PBMのmanはどうやらnetpbmというツールについてくるらしい。

それを読むためにとりあえずインストール

たくさんコマンドがありますね。

よくわかってなかったけど(PPM/PGM/PBM)

| 23:56 | よくわかってなかったけど(PPM/PGM/PBM) - USBカメラを使って色々遊ぶ日記(仮) を含むブックマーク はてなブックマーク - よくわかってなかったけど(PPM/PGM/PBM) - USBカメラを使って色々遊ぶ日記(仮)

  • PPM:カラー画像形式(RGB)
  • PGM:グレースケール形式(濃淡あり 0-255)
  • PBM:2値画像(1pixelあたり1bitで白or黒を表す)

分かってないのにプログラム書いちゃダメだよね。修正しよ。

# ところでPBMで1ビットに満たない余りが出た場合はどうするのだろうか

# パディングでもされるのかな…?

参考リンク

2008-08-15

標準画像でハァハァ

| 02:14 | 標準画像でハァハァ - USBカメラを使って色々遊ぶ日記(仮) を含むブックマーク はてなブックマーク - 標準画像でハァハァ - USBカメラを使って色々遊ぶ日記(仮)

画像処理の研究などで頻繁に使われている標準画像であるレナさんが、実は全身像ではヌードだったというお話。最初に使い出したヤツは何を考えてたんだろうね。

色々な演算をサポートしたライブラリ

| 02:10 | 色々な演算をサポートしたライブラリ - USBカメラを使って色々遊ぶ日記(仮) を含むブックマーク はてなブックマーク - 色々な演算をサポートしたライブラリ - USBカメラを使って色々遊ぶ日記(仮)

どうやらC++向けのようなので今の私には扱えない。

でも、こういうのを学部単位でプロジェクト作ってやるのっていいよね。

しかも公開してるってのが。

PPM/PGM/PBM形式のファイルを読み込むコード

| 16:43 | PPM/PGM/PBM形式のファイルを読み込むコード - USBカメラを使って色々遊ぶ日記(仮) を含むブックマーク はてなブックマーク - PPM/PGM/PBM形式のファイルを読み込むコード - USBカメラを使って色々遊ぶ日記(仮)

適当だけど作った。ヘッダにコメントがある場合は読み込めない。

ヘッダを読むところとかもう少しましな書き方ができると思う。

ファイル名も実態に即していないな。

まだ十分検証していないので随時更新していく予定。

ioutil.h

#ifndef _PPMUTIL_H_
#define _PPMUTIL_H_

typedef enum _img_type_ {
    IMAGE_PBM = 4,
    IMAGE_PGM = 5,
    IMAGE_PPM = 6,
    IMAGE_UNKNOWN,
    IMAGE_NOTFOUND
} ImageType_e;

typedef struct _img_data_ {
    ImageType_e type;
    int width;
    int height;
    int brightness;
    unsigned char *data;
} Image_t;


Image_t *img_read(const char *filename);

int img_write(const char *filename, const Image_t *image);

void img_free(Image_t *image);

#endif /* _PPMUTIL_H_ */

ioutil.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "imageio.h"

#define p(...) fprintf(stderr, __VA_ARGS__)

Image_t *img_read(const char *filename)
{
    FILE *fp;
    char linebuf[1024];
    Image_t *st;
    int itype;
    int scale;

    fp = fopen(filename, "rb");
    if (fp == NULL) {
        p("file not found: %s\n", filename);
        return NULL;
    }

    st = (Image_t*)malloc(sizeof(Image_t));

    /* ヘッダ部分を解析 */
    fgets(linebuf, sizeof(linebuf), fp);
    if (*linebuf != EOF) {
        itype = atoi(&linebuf[1]); /* 2文字目 */
        switch (itype) {
#if 0
        case 4:
            st->type = IMAGE_PBM;
            scale = 1;
            break;
#endif
        case 5:
            st->type = IMAGE_PGM;
            scale = 1;
            break;
        case 6:
            st->type = IMAGE_PPM;
            scale = 3;
            break;
        default:
            st->type = IMAGE_UNKNOWN;
            break;
        }
        p("type: %d, %s\n", st->type, linebuf);
    } else {
        goto end1;
    }

    /* コメント読み飛ばし */
    do {
        fgets(linebuf, sizeof(linebuf), fp); 
    } while (linebuf[0] == '#');

    /* 画像サイズ */
    if (sscanf(linebuf, "%d %d\n", &st->width, &st->height) < 2) {
        goto end1;
    }
    p("(width, height) = (%d, %d)\n", st->width, st->height);

    /* brightness */
    if (fscanf(fp, "%d\n", &st->brightness) == EOF) {
        goto end1;
    }
    p("brightness: %d\n", st->brightness);

    st->data = (unsigned char*)malloc(st->width * st->height * scale);
    if (st->data == NULL) {
        goto end1;
    }

    if (fread(st->data, 1, st->width * st->height * scale, fp) <= 0) {
        goto end2;
    }
    fclose(fp);

    return st;

    /* エラー発生時の処理 */
end2:
    free(st->data);
end1:
    free(st);
    fclose(fp);
    return NULL;
}

int img_write(const char *filename, const Image_t *image)
{
    FILE *fp;
    int scale;

    fp = fopen(filename, "wb");
    if (fp == NULL) {
        return -1;
    }

    fprintf(fp, "P%d\n#by ioutil.c\n%d %d\n%d\n",
            image->type, image->width, image->height, image->brightness);

    switch (image->type) {
    case IMAGE_PPM:
        scale = 3;
        break;
#if 0
    case IMAGE_PBM:
#endif
    case IMAGE_PGM:
    default:
        scale = 1;
        break;
    }

    fwrite(image->data, 1, image->width * image->height * scale, fp);

    fclose(fp);

    return 0;
}

void img_free(Image_t *image) {
    free(image->data);
    free(image);
}

修正点

2008/08/17
  • コメント読み飛ばし対応
  • PBMに対応できていないので読み込まないようにした

2008-07-24

画像認識でペンギンの個体を識別するソフトウェア

| 00:00 | 画像認識でペンギンの個体を識別するソフトウェア - USBカメラを使って色々遊ぶ日記(仮) を含むブックマーク はてなブックマーク - 画像認識でペンギンの個体を識別するソフトウェア - USBカメラを使って色々遊ぶ日記(仮)

ペンギンの胸(腹?)の斑点の位置関係から個体を識別することできるみたい。

これがあればいちいちタグをつけたりしなくていいんだね。

かわいい(ペンギン)とかっこいい(技術)を両立するソフトウェアって夢があるね。

2008-07-15

SIFTなるもの

| 23:36 | SIFTなるもの - USBカメラを使って色々遊ぶ日記(仮) を含むブックマーク はてなブックマーク - SIFTなるもの - USBカメラを使って色々遊ぶ日記(仮)

教えてもらった。

Scale-Invariant Feature Transform(SIFT) は,特徴点の検出と特徴量の記述を行うアルゴリズムである. 検出した特徴点に対して,画像の回転・スケール変化・照明変化等に頑健な特徴量を記述するため,イメージモザイク等の画像のマチングや物体認識・検出に用いられている.

SIFT Tutorial

最近は猫も杓子もSIFTらしい。

メモメモ。