アプリ版:「スタンプのみでお礼する」機能のリリースについて

OpenCVでの画像サイズ取得について教えてください。
rawデータをjpgにして取得し、その画像を4分割したいのですがエラーが3つ出てしまいます。
環境はVisual Studio2008です。
いろいろと調べたのですが、原因や対策がはっきりわからず、書き変えてもNGで困っています。

エラー:その1
「error LNK2028:未解決のトークン(0A00007B)"extern "C" struct IplImage *_cdecl cvLoadImage(char const roi.obj*.int)"(cvLoadImage@@$$J0YAPAU IplImage@@PBDH@Z)が関数"int _codecl main(int,char * *)"(?main@@$$HYAHHPAPAD@Z)で参照されました。」
エラー:その2
「error LNK2019: 未解決の外部シンボル"extern "C" struct IplImage * codecl cvLoadImage(char const *.int)" (?cvLoadImage@@$$J0YAPAU IplImage@@PBDH@Z)が関数"int_codecl main(int, char * *)" (?main@@$$HYAHHPAPAD@Z)で参照されました。」
エラー:その3
「fatal error LNK1120: 外部参照2が未解決です]

'==================
#pragma warning(disable : 4819)
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#define DIVX (4)
#define DIVY (4)
#define DIVXY (DIVX*DIVY)

int main (int argc, char **argv)
{
int w, h

IplImage *img=0;
img=cvLoadImage("C:\・・・\\testfile.jpg, CV_LOAD_IMAGE_GRAYSCALE);

w = img->width - img->width % DIVX + DIVX;
h = img->height - img->height % DIVY + DIVY;

printf("幅は%w, 高さは%h です。 \n");
}
'===============================================

画像サイズを取得し、画像を4分割したあと、画素値を変更したいと思っています。
できればjpgに変換せず、rawデータそのものの精度の画像を直接扱いたいのですが、
その場合、cvLoadImageでどう表記すると実現できるのでしょうか。
また、OpenCVのグレースケールは、何チャンネルなのでしょうか。

プログラム経験はありますが、OpenCVを使うため、C言語の勉強も始めたばかりです。
なにか見当違いな質問をしていたら申し訳ありません。
お忙しいところすみませんが、もしどなたか解決策をアドバイスいただける方がいらっしゃると
大変助かります。
どうぞ宜しくお願い致します。

A 回答 (2件)

まず、コンパイルエラー1,2は「追加ライブラリ」の設定がしてないためだと思われます。


cxcore.lib highgui.lib 等を追加する必要があります。1.x系と2.x系でファイルの名前と場所とか違ったと思うので、確認してください。
その3は上の2つがリンクできなかったので最終的な実行ファイルが作成できなかった旨を伝えるものです。なので、上のエラーがなくなれば出なくなります。

・RAWデータの読み込み
http://opencv.jp/opencv-2svn/c/reading_and_writi …
にあるように、cvLoadImageはRAW画像に対応していません。
また、RAW画像はカメラの機種、メーカーによりさまざまです。ヘッダがあって画像サイズ等の情報が埋め込まれているものもあれば、単純にデータが並んでいるだけのものもあります。
後者の場合は、なんらかの方法で画像サイズをプログラムに教える必要があります(プログラム中に#defineでベタ書きとか、コマンドライン引数にするとか、可逆圧縮または無圧縮フォーマットに変換しておくとか)

なんにせよ,RAWデータがどんな形式になっているかわからないことには、読み込み方法もわかりません。

・cvLoadImageでCV_LOAD_IMAGE_GRAYSCALEで読み込んだ場合、1チャンネルになります。
    • good
    • 0
この回答へのお礼

kmee様

こんなにもすぐに、詳細にアドバイスをくださいましてありがとうございました。
今日、早々にライブラリを追加したところ無事解決でき、ホッとました。
会社からログインできず、お礼の書き込みが遅くなりまして申し訳ありません。

RAWデータについて、ポイントがよくわかりました。
ヘッダがあるかどうか、また読み込み方法について、データの作成元に問い合わせてみます。

そもそも、パターン検出のために画像の白黒のコントラストを強めたい、という目的です。
cvLoadImageでCV_LOAD_IMAGE_GRAYSCALEで読み込むと1チャンネルとのことですが、
グラデーションをより緻密に表現するには、つまり
より幅のある数字の情報を元に、機械がもう少し緻密な判断ができるようにするには、
(グレースケールにもRGBで表現させるなど、何パターンかあるようですが)
通常は何チャンネルを使うのがいいでしょうか。
チャンネル数の問題ではなく、その後どういう処理をするか、がポイントでしょうか。

追加で質問をしてすみませんが、もし何かおわかりでしたらぜひアドバイスいただけると嬉しいです。

そもそもの3つの質問について、わかりやすく的確な回答をくださいまして
本当にありがとうございました。

お礼日時:2010/08/18 23:41

>より幅のある数字の情報を元に、機械がもう少し緻密な判断ができるようにするには、


>通常は何チャンネルを使うのがいいでしょうか。

それは「チャンネル数」ではなく「深さ/精度」です。
グレースケールは「明るさ」というチャンネル1つで表わすものです。その数値の範囲に、たとえば8bit整数(0~255)とか16bit整数(0~65535)とかの「深さ」があります。
また、浮動小数点を使った表現もできます。32bit(float型相当)と64bit(double型相当)のものが使えます。

チャンネル数は例えば、明るさの他に色相,彩度の3チャンネルとか、RGBの3チャンネルとかです。

>(グレースケールにもRGBで表現させるなど、何パターンかあるようですが)
すべての色をR=G=Bにすれば、実質グレースケールです。RGBカラーにしか対応していないフォーマットでグレースケールを表現するときに使います。

>チャンネル数の問題ではなく、その後どういう処理をするか、がポイントでしょうか。

浮動小数点を使って精度を上げた方がよいケースも、逆に、2値化した方がいいケースもあります。
    • good
    • 0
この回答へのお礼

kmee様

連日、わかりやすい回答をくださいましてありがとうございます。
考え違いしていたことがよくわかりました。
今回の目的には「深さ/精度」がポイントであって
浮動小数点を使って精度を上げた方がよいケースかもしれない、
と検討をつけることができました。
自分なりにいろいろと調べましたが行き詰っていたところに、
ここまでクリアなアドバイスをいただけまして
本当に助かりました。
いただいた情報を元に勉強して、進めてみます。
どうもありがとうございました!

お礼日時:2010/08/19 22:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!