キャニー法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぱちお

キャニー法

#1

投稿記事 by ぱちお » 10年前

http://firestorage.jp/download/931a9531 ... b36e58a3bb

こちらのサイトにzipでslnファイルを上げさせていただきました。
このgausstestというものをビルドは通るのにコマンドプロンプトで

cd debug

gausstest lenna.ppm lenna.ppm

のコマンドで画像に使用とするとexeファイルが強制終了してしまうんです。
原因がなにかわかる方いませんか?

こういった質問の仕方がいいのかわかりませんがよろしければお願いいたします

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: キャニー法

#2

投稿記事 by みけCAT » 10年前

ぱちお さんが書きました:http://firestorage.jp/download/931a9531 ... b36e58a3bb

こちらのサイトにzipでslnファイルを上げさせていただきました。
endians.hを修正したあとgcc (GCC) 4.8.1でコンパイル・実行しましたが、-g3をつけた時、-O2をつけた時ともに強制終了はしませんでした。
修正場所

コード:

extern void swapCopyN(void *from, void *to, int n, int count);
extern void swapN(void *buf, int n, int count);
修正後

コード:

extern void swapCopyN(unsigned char *from, unsigned char *to, int n, int count);
extern void swapN(unsigned char *buf, int n, int count);
ぱちお さんが書きました:このgausstestというものをビルドは通るのにコマンドプロンプトで

cd debug

gausstest lenna.ppm lenna.ppm

のコマンドで画像に使用とするとexeファイルが強制終了してしまうんです。
原因がなにかわかる方いませんか?
DLLの不足ではないでしょうか?
kyaniihou_error.png
エラー
kyaniihou_error.png (19.97 KiB) 閲覧数: 3867 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ぱちお

Re: キャニー法

#3

投稿記事 by ぱちお » 10年前

すみません、gausstest.cの

double Lx;

double Lx=0.0;

とすることで解決いたしました。

5*5の重みづけに関してなんですがフィルタに関する質問をここでしても意味がないでしょうか?

ぱちお

Re: キャニー法

#4

投稿記事 by ぱちお » 10年前

コード:

#define Th_sabun 15                            //背景差分の閾値
#define Th_UGOKI 64*2



#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <windows.h>
#include <mmsystem.h>
#include "misc.h"
#include "pgm.h"
#include "gm.h"
#include "ppm.h"
#include "ii.h"
int sabun_r[720][480];
int sabun_g[720][480];
int sabun_b[720][480];


int saishuu_doutai[720][480];

unsigned char gaso_f[720 * 480];//いじくった
unsigned char gaso_b[720 * 480];//いじくった
int gaso_f_ptr;
int gaso_b_ptr;

double r[5][5];
double g[5][5];
double b[5][5];


double psnr(Ppm *ppm1, Ppm *ppm2);
double heikin(unsigned char *val, int gasoptr);

#define maxb(x)     ((x>255) ? 255:x)
#define maxmin(x)  ((x<0) ? 0 : max(x))
#define min0(x)     ((x>0) ? x:0)
#define N 10
inline double saturate(double x){ return ((x>0.0) ? (x<1.0) ? x : 1.0 : 0.0); }
inline double saturate2(double x){ return ((x>0.0) ? (x<255.0) ? x : 255.0 : 0.0); }


//100902 グローバル変数。出力する画像の画素値を、保存しておく変数
//unsigned char *colorr;
unsigned char colorg[720][480];
//unsigned char *colorb;
Pixel *p;
Pixel *p2;
Pixel *p3;

//100902 動きのあるブロックか否かを保持する変数。
int kouho[720 / 8][480 / 8];


// 拡大倍率。この実験では1.0を入れておいて下さい。
//#define RatioH 1.0
//#define RatioW 1.0

//int saishuu_doutai[720][480];

//unsigned char gaso_f[720*480];//いじくった
//unsigned char gaso_b[720*480];//いじくった
//int gaso_f_ptr;
//int gaso_b_ptr;




int main(int argc, char *argv[])
{


	Pgm *pgmIn, *pgmOut;
	Ppm *ppmIn1, *ppmIn2, *ppmOut;

	int newWidth, newHeight;

	int u, v;
	int x, y;
	int x1, x2, y1, y2;
	int goukei_r, goukei_g, goukei_b;
	int goukei_g_min;
	int u_min;
	int v_min;

	IiPpmNb *nb1;
	IiPpmNb *nb2;

	int i, j, k, l;



	double suuji;


	int kido1, kido2;
	int sabun;

	int kouho_tmp;
	int kouho_ryouiki;


	int check;                      //人がいるっぽいと認識した数

	DWORD dwTime_prev, dwTime;


	if (argc < 3){
		printf("iitest gazou ggazou\n");
		return -1;
	}


	// PPMファイルの読み込み       ppmInというポインタ変数に、入力した画像の画素値が入力される。
	ppmIn1 = ppmRead(argv[1]);
	//  ppmIn2=ppmRead(argv[2]);

	// ppmInの書式:
	newWidth = ppmIn1->width;        //画像の幅
	newHeight = ppmIn1->height;      //画像の高さ



	nb1 = iiPpmNbCreate(1, 1);
	//  nb2=iiPpmNbCreate(1, 1);

	//  printf("背景差分の閾値を %d にセットしました。\n", Th_sabun);

	//  suuji = psnr(ppmIn1, ppmIn2);
	//    printf("%f \n", suuji);



	//100902 画像を書き込む準備をする。
	ppmOut = ppmCreate(newWidth, newHeight, PpmMaxPixel);
	p = (Pixel *)calloc(sizeof(Pixel), newWidth*newHeight);


	//puts("1");    

	//100902 背景差分の処理をする部分を作る。
	//

	dwTime_prev = GetTickCount();

	gaso_f_ptr = 0;                                                                                  //131212追加
	gaso_b_ptr = 0;                                                                                  //131212追加

	//
	//
	//ここに、新処理を加える。
	//
	//
	for (i = 1; i<ppmIn1->height - 1; i++){
		for (j = 1; j<ppmIn1->width - 1; j++){

			//3色変数
			//double r00, g00, b00, r10, g10, b10 ,r20 , g20, b20, r01;
			//double g01, b01, r11, g11, b11, r21, g21, b21, r02, g02;
			//double b02, r12, g12, b12, r22, g22, b22;
			//double r30, g30, b30, r40, g40, b40, r31, g31, b31;
			//double r41, g41, b41, r32, g32, b32, r42, g42, b42;
			//double r03, g03, b03, r13, g13, b13, r23, g23, b23;
			//double r33, g33, b33, r43, g43, b43, r04, g04, b04;
			//double r14, g14, b14, r24, g24, b24, r34, g34, b34, r44, g44, b44;

			//平均値変数
			double average_r, average_b, average_g;

			//ファイル①
			// 元の画像の画素を取り出している                               
			int dj, di;
			for (dj = 0; dj < 5; dj++) {
				for (di = 0; di < 5; di++) {
					if (j + dj <= ppmIn1->width && i + di <= ppmIn1->height) {
						iiPpmNbPlace(nb1, ppmIn1, j + dj, i + di);                
						r[dj][di] = nb1->p[0][0].r;                                
						g[dj][di] = nb1->p[0][0].b;                                
						b[dj][di] = nb1->p[0][0].g;                                
					}
					else {
						r[dj][di] = 0;
						g[dj][di] = 0;
						b[dj][di] = 0;
					}
				}
			}




			//新画素平均  左上    上  右上        左     自分    右    左下       下  右下
			double filterX[5][5] = {
				{ 1,  4,  6,  4,  1 },
				{ 4,  16,  24, 16,  4 },
				{ 6,  24, 36, 24, 6 },
				{ 4,  16,  24, 16,  4 },
				{ 1,  4,  6,  4,  1 }
			};

			double filterY[5][5] = {
				{ 2, 1, 0, -1, -2},
				{ 2, 1, 0, -1, -2},
				{ 4, 2, 0, -2, -4},
				{ 2, 1, 0, -1, -2},
				{ 2, 1, 0, -1, -2}
			};

			double filterZ[5][5] = {
				{ 2, 2, 4, 2, 2},
				{ 1, 1, 2, 1, 1},
				{ 0, 0, 0, 0, 0},
				{ -1, -1, -2, -1, -1},
				{ -2, -2, -4, -2, -2 }
			};

			double mult = 256, div = 0.8;
			double Lx=0.0, Ly=0.0, Lz=0.0;

			//赤
			Lx = ((filterX[0][0] * r[0][0]) + (filterX[0][1] * r[0][1]) + (filterX[0][2] * r[0][2]) + (filterX[1][0] * r[1][0]) + (filterX[1][1] * r[1][1]) + (filterX[1][2] * r[1][2]) + (filterX[2][0] * r[2][0]) + (filterX[2][1] * r[2][1]) + (filterX[2][2] * r[2][2]) + (filterX[0][3] * r[0][3]) + (filterX[0][4] * r[0][4]) + (filterX[1][3] * r[1][3]) + (filterX[1][4] * r[1][4]) + (filterX[2][3] * r[2][3]) + (filterX[2][4] * r[2][4]) + (filterX[3][0] * r[3][0]) + (filterX[3][1] * r[3][1]) + (filterX[3][2] * r[3][2]) + (filterX[3][3] * r[3][3]) + (filterX[3][4] * r[3][4]) + (filterX[4][0] * r[4][0]) + (filterX[4][1] * r[4][1]) + (filterX[4][2] * r[4][2]) + (filterX[4][3] * r[4][3]) + (filterX[4][4] * r[4][4])) / mult;
			

			Ly = ((filterY[0][0] * r[0][0]) + (filterY[0][1] * r[0][1]) + (filterY[0][2] * r[0][2]) + (filterY[1][0] * r[1][0]) + (filterY[1][1] * r[1][1]) + (filterY[1][2] * r[1][2]) + (filterY[2][0] * r[2][0]) + (filterY[2][1] * r[2][1]) + (filterY[2][2] * r[2][2]) + (filterY[0][3] * r[0][3]) + (filterY[0][4] * r[0][4]) + (filterY[1][3] * r[1][3]) + (filterY[1][4] * r[1][4]) + (filterY[2][3] * r[2][3]) + (filterY[2][4] * r[2][4]) + (filterY[3][0] * r[3][0]) + (filterY[3][1] * r[3][1]) + (filterY[3][2] * r[3][2]) + (filterY[3][3] * r[3][3]) + (filterY[3][4] * r[3][4]) + (filterY[4][0] * r[4][0]) + (filterY[4][1] * r[4][1]) + (filterY[4][2] * r[4][2]) + (filterY[4][3] * r[4][3]) + (filterY[4][4] * r[4][4])) * div;
			
			
			Lz = ((filterZ[0][0] * r[0][0]) + (filterZ[0][1] * r[0][1]) + (filterZ[0][2] * r[0][2]) + (filterZ[1][0] * r[1][0]) + (filterZ[1][1] * r[1][1]) + (filterZ[1][2] * r[1][2]) + (filterZ[2][0] * r[2][0]) + (filterZ[2][1] * r[2][1]) + (filterZ[2][2] * r[2][2]) + (filterZ[0][3] * r[0][3]) + (filterZ[0][4] * r[0][4]) + (filterZ[1][3] * r[1][3]) + (filterZ[1][4] * r[1][4]) + (filterZ[2][3] * r[2][3]) + (filterZ[2][4] * r[2][4]) + (filterZ[3][0] * r[3][0]) + (filterZ[3][1] * r[3][1]) + (filterZ[3][2] * r[3][2]) + (filterZ[3][3] * r[3][3]) + (filterZ[3][4] * r[3][4]) + (filterZ[4][0] * r[4][0]) + (filterZ[4][1] * r[4][1]) + (filterZ[4][2] * r[4][2]) + (filterZ[4][3] * r[4][3]) + (filterZ[4][4] * r[4][4])) * div;
			//average_r = Lx;//saturate2(Ld*thetaR);          ///// r成分

			//緑
			Lx = ((filterX[0][0] * g[0][0]) + (filterX[0][1] * g[0][1]) + (filterX[0][2] * g[0][2]) + (filterX[1][0] * g[1][0]) + (filterX[1][1] * g[1][1]) + (filterX[1][2] * g[1][2]) + (filterX[2][0] * g[2][0]) + (filterX[2][1] * g[2][1]) + (filterX[2][2] * g[2][2]) + (filterX[0][3] * g[0][3]) + (filterX[0][4] * g[0][4]) + (filterX[1][3] * g[1][3]) + (filterX[1][4] * g[1][4]) + (filterX[2][3] * g[2][3]) + (filterX[2][4] * g[2][4]) + (filterX[3][0] * g[3][0]) + (filterX[3][1] * g[3][1]) + (filterX[3][2] * g[3][2]) + (filterX[3][3] * g[3][3]) + (filterX[3][4] * g[3][4]) + (filterX[4][0] * g[4][0]) + (filterX[4][1] * g[4][1]) + (filterX[4][2] * g[4][2]) + (filterX[4][3] * g[4][3]) + (filterX[4][4] * g[4][4])) / mult;
			
			
			Ly = ((filterY[0][0] * g[0][0]) + (filterY[0][1] * g[0][1]) + (filterY[0][2] * g[0][2]) + (filterY[1][0] * g[1][0]) + (filterY[1][1] * g[1][1]) + (filterY[1][2] * g[1][2]) + (filterY[2][0] * g[2][0]) + (filterY[2][1] * g[2][1]) + (filterY[2][2] * g[2][2]) + (filterY[0][3] * g[0][3]) + (filterY[0][4] * g[0][4]) + (filterY[1][3] * g[1][3]) + (filterY[1][4] * g[1][4]) + (filterY[2][3] * g[2][3]) + (filterY[2][4] * g[2][4]) + (filterY[3][0] * g[3][0]) + (filterY[3][1] * g[3][1]) + (filterY[3][2] * g[3][2]) + (filterY[3][3] * g[3][3]) + (filterY[3][4] * g[3][4]) + (filterY[4][0] * g[4][0]) + (filterY[4][1] * g[4][1]) + (filterY[4][2] * g[4][2]) + (filterY[4][3] * g[4][3]) + (filterY[4][4] * g[4][4])) * div;
			
			
			Lz = ((filterZ[0][0] * g[0][0]) + (filterZ[0][1] * g[0][1]) + (filterZ[0][2] * g[0][2]) + (filterZ[1][0] * g[1][0]) + (filterZ[1][1] * g[1][1]) + (filterZ[1][2] * g[1][2]) + (filterZ[2][0] * g[2][0]) + (filterZ[2][1] * g[2][1]) + (filterZ[2][2] * g[2][2]) + (filterZ[0][3] * g[0][3]) + (filterZ[0][4] * g[0][4]) + (filterZ[1][3] * g[1][3]) + (filterZ[1][4] * g[1][4]) + (filterZ[2][3] * g[2][3]) + (filterZ[2][4] * g[2][4]) + (filterZ[3][0] * g[3][0]) + (filterZ[3][1] * g[3][1]) + (filterZ[3][2] * g[3][2]) + (filterZ[3][3] * g[3][3]) + (filterZ[3][4] * g[3][4]) + (filterZ[4][0] * g[4][0]) + (filterZ[4][1] * g[4][1]) + (filterZ[4][2] * g[4][2]) + (filterZ[4][3] * g[4][3]) + (filterZ[4][4] * g[4][4])) * div;
			//average_g = Lx;//saturate2(Ld*thetaG);          ///// g成分

			//青
			Lx = ((filterX[0][0] * b[0][0]) + (filterX[0][1] * b[0][1]) + (filterX[0][2] * b[0][2]) + (filterX[1][0] * b[1][0]) + (filterX[1][1] * b[1][1]) + (filterX[1][2] * b[1][2]) + (filterX[2][0] * b[2][0]) + (filterX[2][1] * b[2][1]) + (filterX[2][2] * b[2][2]) + (filterX[0][3] * b[0][3]) + (filterX[0][4] * b[0][4]) + (filterX[1][3] * b[1][3]) + (filterX[1][4] * b[1][4]) + (filterX[2][3] * b[2][3]) + (filterX[2][4] * b[2][4]) + (filterX[3][0] * b[3][0]) + (filterX[3][1] * b[3][1]) + (filterX[3][2] * b[3][2]) + (filterX[3][3] * b[3][3]) + (filterX[3][4] * b[3][4]) + (filterX[4][0] * b[4][0]) + (filterX[4][1] * b[4][1]) + (filterX[4][2] * b[4][2]) + (filterX[4][3] * b[4][3]) + (filterX[4][4] * b[4][4])) / mult;
			
			
			Ly = ((filterY[0][0] * b[0][0]) + (filterY[0][1] * b[0][1]) + (filterY[0][2] * b[0][2]) + (filterY[1][0] * b[1][0]) + (filterY[1][1] * b[1][1]) + (filterY[1][2] * b[1][2]) + (filterY[2][0] * b[2][0]) + (filterY[2][1] * b[2][1]) + (filterY[2][2] * b[2][2]) + (filterY[0][3] * b[0][3]) + (filterY[0][4] * b[0][4]) + (filterY[1][3] * b[1][3]) + (filterY[1][4] * b[1][4]) + (filterY[2][3] * b[2][3]) + (filterY[2][4] * b[2][4]) + (filterY[3][0] * b[3][0]) + (filterY[3][1] * b[3][1]) + (filterY[3][2] * b[3][2]) + (filterY[3][3] * b[3][3]) + (filterY[3][4] * b[3][4]) + (filterY[4][0] * b[4][0]) + (filterY[4][1] * b[4][1]) + (filterY[4][2] * b[4][2]) + (filterY[4][3] * b[4][3]) + (filterY[4][4] * b[4][4])) * div;
			
			
			Lz = ((filterZ[0][0] * b[0][0]) + (filterZ[0][1] * b[0][1]) + (filterZ[0][2] * b[0][2]) + (filterZ[1][0] * b[1][0]) + (filterZ[1][1] * b[1][1]) + (filterZ[1][2] * b[1][2]) + (filterZ[2][0] * b[2][0]) + (filterZ[2][1] * b[2][1]) + (filterZ[2][2] * b[2][2]) + (filterZ[0][3] * b[0][3]) + (filterZ[0][4] * b[0][4]) + (filterZ[1][3] * b[1][3]) + (filterZ[1][4] * b[1][4]) + (filterZ[2][3] * b[2][3]) + (filterZ[2][4] * b[2][4]) + (filterZ[3][0] * b[3][0]) + (filterZ[3][1] * b[3][1]) + (filterZ[3][2] * b[3][2]) + (filterZ[3][3] * b[3][3]) + (filterZ[3][4] * b[3][4]) + (filterZ[4][0] * b[4][0]) + (filterZ[4][1] * b[4][1]) + (filterZ[4][2] * b[4][2]) + (filterZ[4][3] * b[4][3]) + (filterZ[4][4] * b[4][4])) * div;
			//average_b = Lx;//saturate2(Ld*thetaB);          ///// b成分

			Ly /= 3;
			Lz /= 3;

			double deltaL = sqrt(pow(Ly,2)+pow(Lz,2))/2;

			average_r = saturate2(deltaL);
			average_b = saturate2(deltaL);
			average_g = saturate2(deltaL);


			p->r = (unsigned char)(average_r);          //r成分の画素値を書き込む
			p->b = (unsigned char)(average_b);          //b成分の画素値を書き込む
			p->g = (unsigned char)(average_g);          //g成分の画素値を書き込む

			PpmPixel(ppmOut, i, j) = *p++;

		}
	}

	ppmWrite(argv[2], ppmOut);




	printf("done.\n");

}



double psnr(Ppm *ppm1, Ppm *ppm2){
	int i, j;
	IiPpmNb *nb1;
	IiPpmNb *nb2;
	double psnr_r, psnr_g, psnr_b;
	double add_r, add_g, add_b;
	double psnrout;


	nb1 = iiPpmNbCreate(1, 1);
	nb2 = iiPpmNbCreate(1, 1);

	add_r = 0.0;
	add_g = 0.0;
	add_b = 0.0;

	for (i = 0; i<ppm1->height; i++)
	for (j = 0; j<ppm1->width - 1; j++){

		iiPpmNbPlace(nb1, ppm1, j, i);
		iiPpmNbPlace(nb2, ppm2, j, i);
		add_r += (double)((nb1->p[0][0].r - nb2->p[0][0].r)*(nb1->p[0][0].r - nb2->p[0][0].r));
		add_g += (double)((nb1->p[0][0].g - nb2->p[0][0].g)*(nb1->p[0][0].g - nb2->p[0][0].g));
		add_b += (double)((nb1->p[0][0].b - nb2->p[0][0].b)*(nb1->p[0][0].b - nb2->p[0][0].b));
	}

	add_r /= (ppm1->height*ppm1->width);
	add_g /= (ppm1->height*ppm1->width);
	add_b /= (ppm1->height*ppm1->width);
	psnr_r = 10.0 * log(65536.0 / add_r);
	psnr_g = 10.0 * log(65536.0 / add_g);
	psnr_b = 10.0 * log(65536.0 / add_b);

	printf("R:%f G:%f B:%f \n", psnr_r, psnr_g, psnr_b);

	psnrout = (psnr_r + psnr_g + psnr_b) / 3.0;

	return psnrout;
}
このプログラムは現状LyとLz(deltaL)を掛け合わせたもののみがフィルタリングされるようになっていると思うのですがfilterXをかけた後にdeltaLをかけるにはどういう変更をすればよいか教えてもらえませんか?

閉鎖

“C言語何でも質問掲示板” へ戻る