ページ 11

opencvを用いたHOG処理。画像が読み込まれない

Posted: 2016年10月19日(水) 23:20
by takezawaakiragm
opencvを用いてHOG(輝度勾配の抽出)をするコードなのですが、ビルドは通るのですがデバックした際にfileが指定されていない状態になってしまいます。
何をやっても画像が指定されていないとなってしまいます。
パスなど思いつくこと、ネットに書いてあることはすべて試しましたが解決できませんでした。
違う根本的なミスがあるかとおもうのですが、分かるかたご教授お願いします。
vs2013 opencv3.1.0

main.cpp

コード:

#include <stdio.h>
#include <string.h>
#include <opencv/cv.h>
#include <opencv/cxcore.h>
#include <opencv/highgui.h>
#include "learning.h"
#include "HOG.h"
#include "common.h"

int onFileOpen(int count);

Clearning	ob_LEARN;
CHOG		ob_HOG;

IplImage* imgSource = NULL;
IplImage* imgLowSource = NULL;


int main(){
	int i;
	double descriptor[FEATURE];
	
	// 画像読み込み
	onFileOpen(0);


	//領域確保
	CvSize r_size  = cvSize((int)SET_X_SIZE , (int) SET_Y_SIZE);

	imgLowSource = cvCreateImage(r_size, IPL_DEPTH_8U, 1);

	printf("特徴抽出\n");
	for(i=0;i<FILE_NUM;i++){

		//ファイル読み込み
		onFileOpen(i);

		//低解像度へ
		cvResize( imgSource, imgLowSource, CV_INTER_LINEAR);

		//初期化
		ob_HOG.Init(imgLowSource);

		//ヒストグラムの作成
		ob_HOG.CompHist(imgLowSource);

		//特徴量の抽出
		ob_HOG.Getfeature(descriptor);


		//特徴量を学習用にストック
		ob_LEARN.FeatureStock(descriptor,i);

		cvReleaseImage(&imgSource);
	}

	printf("特徴抽出終了\n");
	ob_LEARN.RealAdaBoost();

	cvReleaseImage(&imgLowSource);

	return 0;
}

int onFileOpen(int count){
	char fname[200];    // ファイル名を格納するのに充分なサイズ
	
	if(count<POS_FILE){
		///ここでfnameに画像pathが渡されなければならない
		sprintf_s(fname, "%s%d.bmp", INPUT_POS_DIR, count);
	}else{
		sprintf_s(fname, "%s%d.bmp", INPUT_NEG_DIR, count - POS_FILE);
	}
	//ここが常に成り立ってしまうために進まない
	//    NULL   に  cvLoadImage(fname, 0)を代入これが0のとき(0はglaysclaeと同様)
	if ((imgSource = cvLoadImage(fname, 0)) == 0){
		printf("File open error %d\n", count);
		exit(1);
	}
	return 0;
}


commom.h

コード:

 
#define INPUT_POS_DIR			"./Data/Input/test1.bmp"
#define INPUT_NEG_DIR			"./Data/Input/test3.bmp"


HOG.h

コード:

#pragma once

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <math.h>
#include <stdio.h>

#define CELL_SIZE				8		//8*8pixel
#define BLOCK_SIZE				2		//2*2cell
#define PI						3.14
#define LN_E					1.0
#define SET_X_SIZE				64		//低解像度にしたときのXの大きさ
#define SET_Y_SIZE				128		//低解像度にしたときのYの大きさ
#define ORIENTATION				9

class CHOG
{

public:
	CHOG(void);
	~CHOG(void);
	int Init(IplImage* img);
	int CompHist(IplImage* img);
	int Getfeature(double hog_feature[]);

private:
	int bpp;
	int wStep;
	double cell_hist[(SET_X_SIZE/CELL_SIZE)][(SET_Y_SIZE/CELL_SIZE)][9];


};


Re: opencvを用いたHOG処理。画像が読み込まれない

Posted: 2016年10月19日(水) 23:30
by みけCAT
「DIR」で終わる定数の定義にファイル名っぽい部分があるのは不自然な気がしますが、指定しているファイルパスは本当に正しいですか?

Re: opencvを用いたHOG処理。画像が読み込まれない

Posted: 2016年10月19日(水) 23:33
by みけCAT
main.cppの75行目の
takezawaakiragm さんが書きました:

コード:

	//    NULL   に  cvLoadImage(fname, 0)を代入これが0のとき(0はglaysclaeと同様)
というコメントも、以下の点で不自然ですね。
  • 実際の代入先はNULLではなく、imgSourceなのに、NULLになんとかを代入という不自然な表現がされている
  • opencvの用語はわからないが、grayscaleではなく本当にググっても情報が出ないglaysclaeなのか?

Re: opencvを用いたHOG処理。画像が読み込まれない

Posted: 2016年10月20日(木) 12:11
by takezawaakiragm
修正しました
commom.h

コード:

 
#define INPUT_POS_DIR			"./Data/Input/pos/"
#define INPUT_NEG_DIR			"./Data/Input/neg/"
 


いじってる間にファイル名書いてしまったみたいです。

このようにしても何も変わらず、画像が読み込まれませんでした。

Re: opencvを用いたHOG処理。画像が読み込まれない

Posted: 2016年10月20日(木) 12:26
by takezawaakiragm
•実際の代入先はNULLではなく、imgSourceなのに、NULLになんとかを代入という不自然な表現がされている
>>コメントに関しては、今回の原因を理解しようと書いてしまった余分なものです。

•opencvの用語はわからないが、grayscaleではなく本当にググっても情報が出ないglaysclaeなのか?
>>誤字です。×glaysclae  ○grayscale

Re: opencvを用いたHOG処理。画像が読み込まれない

Posted: 2016年10月20日(木) 12:50
by takezawaakiragm
***************入力ファイル***************

入力するポジティブサンプル画像は下記から読み込みます.
./Data/Input/pos/
入力するネガティブサンプル画像は下記から読み込みます.
./Data/Input/neg/

出力ファイルは,Real AdaBoostのアルゴリズムで選択された弱識別器と、
その弱識別器に対する確率密度分布です.
下記に出力されます.
./Data/Output/LUT/




***************設定パラメータ***************
Real AdaBoostの設定パラメータについて説明します.
"learning.h"内にてパラメータを調整することができます.
調整可能なパラメータを下記に示します.

・FEATURE
入力する特徴量の個数です.

・POS_FILE
ポジティブサンプルの数です.

・NEG_FILE
ネガティブサンプルの数です.

・EPSILON
弱識別器の出力を計算する際に,0で割る計算を回避するためのものです.
この値は,とても小さい値の方が良い学習を行います.

・FILE_NUM
全サンプル数の数です.

・LEARNING_NUM
学習回数です.

・TH
学習サンプルを用いて識別を行う際のしきい値です.
学習自体には影響を及ぼしません.

・BIN
確率密度分布をLUTとして扱いますが,そのヒストグラムのBINのビンの数です.


・TEST
学習サンプルを用いた識別実験を行うかどうかです.
#define文でTESTを定義することによって実験を行うかどうかを設定することができます.
学習が正しく行うことができているかのチェックに使用することができます.
非常に時間のかかる学習の場合は,TESTの定義をしないことで高速に学習することが可能です.