OpenCV/RAW画像生成 †
床井研究室 - 第1回 画像の読み込みにあるサンプルをちょっといじっていて,
RAW画像が必要になったのですが,
Photoshopなんか持ってねー ということで,bmpやjpgなどからRAW画像を出力するプログラム
を作成してみました.
「OpenCVのcvLoadImage?で画像を読み込んで,画像データ領域だけを抜き出して,BGR->RGB変換してテクスチャにすれば,こんなことしなくても良い」というのは聞こえないフリします。。。(∩゚д゚)アーアーきこえなーい
RAW画像はデータベタ書きなため比較的扱いやすいので,大学の講義のC言語による画像処理演習でよく用いられているみたいです.なので,課題でRAW画像が必要ってときなんかにも使えるかも.
サンプルコード †
いくつかのファイルに分割した方が良いのですが,ここに載せるのが面倒になるので
横着して1つのファイルにしました.ゴメンナサイ. (T-T
使い方 †
コンパイルしてできたexeファイルに8ビット カラーの画像(bmp,jpgなど)をドラッグアンドドロップすると,
同じ階層にRGB順に画素値が格納されたバイナリ形式のrawファイルが生成されます.
| #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
using namespace std;
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"highgui.lib")
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#define RAW_EXTENSION ".raw"
typedef struct _RGB_DATA
{
uchar r; uchar g; uchar b; }RGB_DATA;
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
{
}
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 = 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;
}
|