OpenCV/RAW画像生成

床井研究室 - 第1回 画像の読み込みにあるサンプルをちょっといじっていて, RAW画像が必要になったのですが,
Photoshopなんか持ってねー (..; ということで,bmpやjpgなどからRAW画像を出力するプログラム を作成してみました.

「OpenCVのcvLoadImage?で画像を読み込んで,画像データ領域だけを抜き出して,BGR->RGB変換してテクスチャにすれば,こんなことしなくても良い」というのは聞こえないフリします。。。(∩゚д゚)アーアーきこえなーい

RAW画像はデータベタ書きなため比較的扱いやすいので,大学の講義のC言語による画像処理演習でよく用いられているみたいです.なので,課題でRAW画像が必要ってときなんかにも使えるかも.

サンプルコード

いくつかのファイルに分割した方が良いのですが,ここに載せるのが面倒になるので
横着して1つのファイルにしました.ゴメンナサイ. (T-T

使い方

コンパイルしてできたexeファイルに8ビット カラーの画像(bmp,jpgなど)をドラッグアンドドロップすると,
同じ階層にRGB順に画素値が格納されたバイナリ形式のrawファイルが生成されます.

fileconvRAW.cpp
//----------------------------------------------------------------------
// 概要      : 8bit カラー画像をraw形式に変換
// File Name : convRAW.cpp
// Library   : OpenCV for MS-Windows 1.0
// Author    : dandelion
// Date      : Feb 3rd, 2008; 00:00
//----------------------------------------------------------------------
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>

using namespace std;

//------------------------------
//OpenCV関連のインクルード
//------------------------------
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
//------------------------------

//raw拡張子
#define RAW_EXTENSION ".raw"

//RGBデータ構造体
typedef struct _RGB_DATA
{
    uchar r;    //R
    uchar g;    //G
    uchar b;    //B
}RGB_DATA;

//---------------------------------------------------------------
//概 要:座標(x, y)のRGB値を取得する
//引数1:img			画像
//引数2:x				x座標値
//引数3:y				y座標値
//戻り値:RGB_DATA		RGB値
//---------------------------------------------------------------
RGB_DATA getRGB(IplImage *img, unsigned int x, unsigned int y)
{
    RGB_DATA data;
    data.r = data.g = data.b = 0;
    data.b = ((uchar*)(img->imageData + img->widthStep*y))[x*3];
    data.g = ((uchar*)(img->imageData + img->widthStep*y))[x*3+1];
    data.r = ((uchar*)(img->imageData + img->widthStep*y))[x*3+2];
    return data;
}


int main( int argc, char **argv)
{
    RGB_DATA rgb;
    rgb.r = rgb.g = rgb.b = 0;
    string outFileName = "";
    FILE *fp;

    //引数チェック
    if(argc != 2)
    {
        fprintf(stderr, "[Usage] %s filename\n", argv[0]);
        exit(1);
    }
    else
    {
        //出力ファイル名生成
        string inFileName(argv[1]);
        string::size_type index = inFileName.rfind(".");
        outFileName = inFileName.substr( 0, index );
        outFileName += RAW_EXTENSION;    //拡張子を付加
    }

    //画像の読み込み
    IplImage *image = cvLoadImage(argv[1], CV_LOAD_IMAGE_COLOR);

    //画像読み込みに失敗した場合
    if(image == NULL)
    {
        fprintf(stderr, "[Error]Image File Open Error!\n");
        exit(1);
    }
    else
    {
        //DO NOTHING
    }

    //ファイルオープン(バイナリ書き込みモード)
    fp = fopen(outFileName.c_str(), "wb");

    //ファイルオープンに成功したらデータを書き込む
    if(fp != NULL)
    {
        for(int y = 0; y < image->height; y++)
        {
            for(int x = 0; x < image->width; x++)
            {
                //RGB値取得
                rgb = getRGB(image, x, y);

                //バイナリデータ書き込み
                fwrite(&rgb.r , sizeof(uchar) , 1 , fp);
                fwrite(&rgb.g , sizeof(uchar) , 1 , fp);
                fwrite(&rgb.b , sizeof(uchar) , 1 , fp);
            }
        }

        //ファイルクローズ
        fclose(fp);
    }
    else
    {
        fprintf(stderr, "[Error]File Open Error!\n");
    }

    //メモリ解放
    cvReleaseImage( &image );

    return 0;
}

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-06-19 (木) 21:46:00 (3295d)