今年4月から、知り合いもいない友達もいない岡山に来ました。留学の生活を恋しくて、岡大の留学活動には参加させて頂いたらうれしいです。
2 名前:名無しさん [2004/09/26(日) 02:21] 知っていましたか?
岡山県ってもうすぐ無くなるんですよ。
削除
4 名前:名無しさん [2006/07/10(月) 14:49] ∩___∩ ∩____∩
| ノ u ヽ / u u └| ∩____∩
/ # ● ● | | ● ● # .ヽ/ u └|
| u ( _●_) ミ 彡 (_●_ ) u |● ● # ヽ
彡、 |∪| 、`\ / |∪| 彡 (_●_) u |
同じゼミの中国人留学生と鍋パ―ティ―とかして交流してますよ
6 名前:名無しさん [2006/07/10(月) 23:41]たしかに中国人留学生多いよな
7 名前:k3b.c [2007/01/19(金) 10:09] main(){
Matrix mt, vt, mtLt, tmp,tmp2;
int i,j,ran,t,t3,p,pmax;
double t1,t2;
double z=1;
double kai[4];
double za1[2];
double za2[2];
double a[4][2],b[4][2];
double a1[][2]={
317,494,
119,194,
407,324,
137,456,
355,506,
10,564,
99,210,
296,496,
336,512,
113,398,
384,464,
195,519,
108,199,
302,329,
386,325,
615,439,
128,410,
403,462,
685,481,
458,470,
234,529,
294,560,
96,229,
289,323,
141,517,
348,331,
377,323,
135,501,
114,505,
640,471,};
double a2[][2]={
566,506,
367,209,
658,332,
388,463,
606,520,
272,560,
349,226,
545,507,
585,525,
365,407,
635,478,
444,525,
367,219,
110,400,
463,528,
96,333,
542,567,
549,339,
656,475,
452,526,
715,486,
366,509,
380,417,
389,528,
180,296,
211,404,
356,251,
391,519,
271,478,
483,536};
srand(time(NULL));
pmax=0;
for (t=0;t<10000;t++)
{
for (j=0; j<4; j++) {
ran =rand()%30;
if(ran==t3) ran =rand()%30;
t3=ran;
printf("%3d,",ran);
a[j][0]=a1[ran][0];
a[j][1]=a1[ran][1];
b[j][0]=a2[ran][0];
b[j][1]=a2[ran][1];
}
printf("->");
MatrixInit(&mtLt,8,8);
MatrixLQDecomp(&mtLt,&mt);
// solve Least-squares equation
MatrixInit(&tmp,1,8);
MatrixMultT(&tmp,&vt,&mt);
MatrixSimeqLr(&tmp,&mtLt);
//MatrixPrint(&tmp);
p=0;
for(i=0;i<30;i++){
za1[0]=a1[i][0]*Elem(&tmp,0,0)+a1[i][1]*Elem(&tmp,0,1)+Elem(&tmp,0,2)+100;
za1[1]=a1[i][0]*Elem(&tmp,0,3)+a1[i][1]*Elem(&tmp,0,4)+Elem(&tmp,0,5)+100;
//printf("%f ",za1[0]);
//printf("%f\n",za1[1]);
za2[0]=a2[i][0];
za2[1]=a2[i][1];
//printf("%f ",za2[0]);
//printf("%f\n",za2[1]);
t1=za1[0]-za2[0];
t1=t1*t1;
t2=za1[1]-za2[1];
t2=t2*t2;
t1=t1+t2;
if(t1<1000){
p++;
}
}
printf("%d\n",p);
if( p>pmax){
pmax=p;
tmp2=tmp;
}
}
printf("%d\n",pmax);
MatrixPrint(&tmp2);
}
#include"f1sub.h"
#define INFINITY (1/0.)
#define Elem(_a,_b,_c) (_a)->data[(_a)->W*(_b)+(_c)]
#define IElem(_a,_x,_y,_i) (_a)->data[((_a)->W*(_y)+(_x))*3+(_i)]
#define DElem(_a,_x,_y) (_a)->data[(_a)->W*(_y)+(_x)]
void ImageInit(Image*im,int _W,int _H){
im->W = _W,
im->H = _H;
im->data=(unsigned char*)malloc(im->W*im->H*3);
}
void ImageClear(Image*im){
memset(im->data,0,im->W*im->H*3);
}
void ImageImageProjectionAlpha(Image*vw,Image*im,double a[3][3],double alpha){
int i,j,u,v;
double r;
for(i=0;i<vw->H;i++) for(j=0;j<vw->W;j++){
r = 1 / (a[2][0]*j+a[2][1]*i+a[2][2]);
u = r * (a[0][0]*j+a[0][1]*i+a[0][2]);
v = r * (a[1][0]*j+a[1][1]*i+a[1][2]);
if( (unsigned)u < im->W &&
(unsigned)v < im->H ){
vw->data[(i*vw->W+j)*3+0] += im->data[(v*im->W+u)*3+0]*alpha,
vw->data[(i*vw->W+j)*3+1] += im->data[(v*im->W+u)*3+1]*alpha,
vw->data[(i*vw->W+j)*3+2] += im->data[(v*im->W+u)*3+2]*alpha;
}
}
}
void ImageDrawBox(Image*im,int j,int i){
int u,v,W=7;
for(v=-W;v<=W;v++) for(u=-W;u<=W;u++){
IElem(im,j+u,i+v,2) = IElem(im,j+u,i+v,2) + 255 >> 1;
IElem(im,j+u,i+v,1) = IElem(im,j+u,i+v,1) >> 1;
IElem(im,j+u,i+v,0) = IElem(im,j+u,i+v,0) >> 1;
}
}
void MatrixInit(Matrix*mt,int _H,int _W){
mt->W = _W,
mt->H = _H;
mt->data=(double*)malloc(mt->W*mt->H*sizeof(double));
}
double ImageSSD(Image*im,int x1,int y1, Image*im2,int x2,int y2){
int i,j,W=7;
double s=0,dr,dg,db;
for(i=-W;i<=W;i++) for(j=-W;j<=W;j++){
dr = IElem(im, x1+j, y1+i, 0) - IElem(im2, x2+j , y2+i, 0);
dg = IElem(im, x1+j, y1+i, 1) - IElem(im2, x2+j , y2+i, 1);
db = IElem(im, x1+j, y1+i, 2) - IElem(im2, x2+j , y2+i, 2);
s += dr*dr+dg*dg+db*db;
}
return s;
}
void createSSDij(Matrix*mt,Image*im ,int x1[][2],int N1,Image*im2,int x2[][2],int N2){
int i,j;
for(i=0;i<N1;i++)
for(j=0;j<N2;j++)
Elem(mt,i,j) = ImageSSD(im ,x1[i][0],x1[i][1],im2,x2[j][0],x2[j][1]);
}
void matchMethod1(Matrix*mt,Image*im ,int x1[][2],int N1,Image*im2,int x2[][2],int N2,int kkk[][5]){
int i,j,k,ji;
#ifdef DRAW
Viewer vw;
Image iv;
ImageInit(&iv,im->W,im->H);
ViewerInit(&vw,im->W,im->H);
double upper[][3]={2,0,0, 0,2,0, 0,0,1};
double lower[][3]={2,0,0, 0,2,-im->H, 0,0,1};
#endif
for(i=0;i<N1;i++){
double sm=INFINITY,t;
for(j=0;j<N2;j++){
t=Elem(mt,i,j);
#ifdef DRAW
#endif
if( sm > t ) sm = t, ji=j;
}
printf("%f\n ",sm);
printf("%d,%d,%d,%d,\n\n",
x1[i][0],x1[i][1],
x2[ji][0],x2[ji][1]);
kkk[i][0]=x1[i][0];
kkk[i][1]=x1[i][1];
kkk[i][2]=x2[ji][0];
kkk[i][3]=x2[ji][1];
kkk[i][4]=sm;
for(k=0;k<N2;k++) Elem(mt,k,ji) = INFINITY;
#ifdef DRAW
ImageClear(&iv);
ImageImageProjectionAlpha(&iv,im ,upper,1);
ImageImageProjectionAlpha(&iv,im2,lower,1);
ImageDrawBox(&iv,x1[i][0]/2,x1[i][1]/2);
ImageDrawBox(&iv,x2[ji][0]/2,x2[ji][1]/2+im->H/2);
ViewerImageWrite(&vw,&iv);
ViewerLoop(&vw);
#endif
}
}
main(int ac,char**av){
Image im,im2;
Matrix mt;
int kw =30;
int kkk[30][5];
int i,j,t1,t2,t3,t4,t5;
int x1[][2]={
#include"0.fea"
}, N1=30;
int x2[][2]={
#include"2.fea"
}, N2=30;
if(ac<3) return 1;
ImageRead(&im ,av[1]);
ImageRead(&im2,av[2]);
MatrixInit(&mt,N1,N2);
createSSDij(&mt,&im,x1,N1,&im2,x2,N2);
matchMethod1(&mt,&im,x1,N1,&im2,x2,N2,kkk);
// $B:G8e$NMWAG$r=|$$$F!"$9$Y$F$NMWAG$rJB$YBX$($^$9(B
for(i=0;i<kw;i++){
// $B2<$+$i>e$K=gHV$KHf3S$7$^$9(B
for(j=kw-1;j>i;j--){
// $B>e$NJ}$,Bg$-$$$H$-$O8_$$$KF~$lBX$($^$9(B
if(kkk[j][4]<kkk[j-1][4]){
t1=kkk[j][0];
t2=kkk[j][1];
t3=kkk[j][2];
t4=kkk[j][3];
t5=kkk[j][4];
kkk[j][0]=kkk[j-1][0];
kkk[j-1][0]=t1;
kkk[j][1]=kkk[j-1][1];
kkk[j-1][1]=t2;
kkk[j][2]=kkk[j-1][2];
kkk[j-1][2]=t3;
kkk[j][3]=kkk[j-1][3];
kkk[j-1][3]=t4;
kkk[j][4]=kkk[j-1][4];
kkk[j-1][4]=t5;
}
}
}
for(i=0;i<30;i++){
printf("%d,%d,%d,%d\n",kkk[i][0] ,kkk[i][1],kkk[i][2] ,kkk[i][3] );
ImageClear(&iv);
ImageImageProjectionAlpha(&iv,im ,upper,1);
ImageImageProjectionAlpha(&iv,im2,lower,1);
ImageDrawBox(&iv,x1[i][0]/2,x1[i][1]/2);
ImageDrawBox(&iv,x2[ji][0]/2,x2[ji][1]/2+im->H/2);
ViewerImageWrite(&vw,&iv);
ViewerLoop(&vw);
}
}
#include<X11/Xlib.h>
#include<math.h>
#include"f1sub.h"
#define IElem(_a,_x,_y,_i) (_a)->data[((_a)->W*(_y)+(_x))*3+(_i)]
#define DElem(_a,_x,_y) (_a)->data[(_a)->W*(_y)+(_x)]
typedef struct {
double*data;
int W,H;
} DImage;
void ImageDrawBox(Image*im,int j,int i,int t){
int u,v,W=7;
for(v=-W;v<=W;v++) for(u=-W;u<=W;u++){
IElem(im,j+u,i+v,2) = IElem(im,j+u,i+v,2) + t/2000 >> 1;
IElem(im,j+u,i+v,1) = IElem(im,j+u,i+v,1) >> 1;
IElem(im,j+u,i+v,0) = IElem(im,j+u,i+v,0) >> 1;
}
}
void DImageInit(DImage*im,int _W,int _H){
im->W = _W,
im->H = _H;
im->data=(double*)malloc(im->W*im->H*sizeof(double));
}
void ImageDImageWrite(Image*vw,DImage*im,double s){
int i,j,p;
for(i=0;i<im->H;i++) for(j=0;j<im->W;j++) {
double tmp = im->data[i*im->W+j] * s;
if(tmp>255) tmp=255;
vw->data[(i*vw->W+j)*3+0] =
vw->data[(i*vw->W+j)*3+1] =
vw->data[(i*vw->W+j)*3+2] = tmp;
}
}
void ImageDImageWrite(Image*vw,DImage*im,double s){
int i,j,p;
for(i=0;i<im->H;i++) for(j=0;j<im->W;j++) {
double tmp = im->data[i*im->W+j] * s;
if(tmp>255) tmp=255;
vw->data[(i*vw->W+j)*3+0] =
vw->data[(i*vw->W+j)*3+1] =
vw->data[(i*vw->W+j)*3+2] = tmp;
}
}
void ImageFeature(DImage*im2,Image*im){
int i,j,u,v,W=7,ix,iy;
for(v=W+1;v<im->H-W-1;v++) for(u=W+1;u<im->W-W-1;u++){
double ixx,ixy,iyy,ans;
ixx=iyy=ixy=0;
for(i=-W;i<=W;i++) for(j=-W;j<=W;j++){
ix = IElem(im, u+j+1 , v+i , 1) - IElem(im, u+j-1 , v+i , 1);
iy = IElem(im, u+j , v+i+1 , 1) - IElem(im, u+j , v+i-1 , 1);
ixx+=ix*ix;
iyy+=iy*iy;
ixy+=ix*iy;
}
DElem(im2,u,v) = ((ixx+iyy)-sqrt((ixx+iyy)*(ixx+iyy)-4*(ixx*iyy-ixy*ixy)))/2;
}}
int DImageMax(int w[][3], DImage*im2){
int a,b,i,j,u,v,W=7,n=0;
double max=0;
for(v=W+1;v<im2->H-W-1;v++) for(u=W+1;u<im2->W-W-1;u++){
for(i=-W;i<=W;i++) for(j=-W;j<=W;j++){
// 領域内で DElem(im2,j+u,i+v) の最大値をとる位置を探す
if(max < DElem(im2,j+u,i+v))
{
a = j+u;
b = i+v;
max = DElem(im2,j+u,i+v);
}
}
// 上記の位置が u,v であれば、(u,v) を特徴点として出力する
// printf("%d %d\n",u,v); あるいは w[][] に格納する。
if(a == u && b == v)
{
w[n][0] = u;
w[n][1] = v;
w[n][2] = max;
n++;
}
max = 0;
}
return n;
}
main(int ac,char**av){
Viewer vw;
Image im;
DImage im2;
int kk[9999][3], kw,i,j,t1,t2,t3;
if(ac<2) return 1;
ImageRead(&im,av[1]);
DImageInit(&im2,im.W,im.H);
ImageFeature(&im2,&im);
kw=DImageMax(kk,&im2);
ViewerInit(&vw,im.W,im.H);
// ImageDImageWrite(&im,&im2,.001);
// for(i=0;i<kw;i++) ImageDrawBox(&im,kk[i][0],kk[i][1],kk[i][2]);
printf("%d\n",kw);
// 最後の要素を除いて、すべての要素を並べ替えます
for(i=0;i<kw;i++){
// 下から上に順番に比較します
for(j=kw-1;j>i;j--){
// 上の方が大きいときは互いに入れ替えます
if(kk[j][2]>kk[j-1][2]){
t1=kk[j][0];
t2=kk[j][1];
t3=kk[j][2];
kk[j][0]=kk[j-1][0];
kk[j-1][0]=t1;
kk[j][1]=kk[j-1][1];
kk[j-1][1]=t2;
kk[j][2]=kk[j-1][2];
kk[j-1][2]=t3;
}
}
}
for(i=0;i<40;i++)
printf("%d,%d,\n",kk[i][0] ,kk[i][1]);
for(i=0;i<40;i++) ImageDrawBox(&im,kk[i][0],kk[i][1],kk[i][2]);
ViewerImageWrite(&vw,&im);
ViewerLoop(&vw);
}
// cc k4.c -I /usr/X11R6/include -L /usr/X11R6/lib -lX11 ; ./a.out
/* 共通部分は省略 */
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<X11/Xlib.h>
typedef struct {
Display*d;
Window w;
XImage*img;
short*data;
int W,H;
} Viewer;
typedef struct {
unsigned char*data;
int W,H;
} Image;
void ViewerInit(Viewer*vw, int _W,int _H){
vw->W = _W;
vw->H = _H;
vw->d = XOpenDisplay(0);
vw->w = XCreateSimpleWindow(vw->d,RootWindow(vw->d,0), 0,0, _W,_H,1, 0,0);
XMapWindow(vw->d,vw->w);
vw->data = (short*)malloc(_W*_H*2);
vw->img = XCreateImage(vw->d,DefaultVisual(vw->d,0), 16, ZPixmap, 0, (char*)vw->data, _W,_H,8,2*_W);
}
void ViewerLoop(Viewer*vw){
while(1){
XPutImage(vw->d,vw->w,DefaultGC(vw->d,0),vw->img,0,0,0,0,vw->W,vw->H);
XFlush(vw->d);
usleep(300000);
}
}
void ImageRead(Image*im){
scanf("%*s%d%d%*s%*c",&im->W,&im->H);
im->data=(unsigned char*)malloc(im->W*im->H*3);
fread(im->data,1,im->W*im->H*3,stdin);
}
void ImageRead0(Image*im){
FILE *fp=popen("djpeg 0.jpg","r");
fscanf(fp,"%*s%d%d%*s%*c",&im->W,&im->H);
im->data=(unsigned char*)malloc(im->W*im->H*3);
fread(im->data,1,im->W*im->H*3,fp);
pclose(fp);
}
void ImageRead1(Image*im){
FILE *fp=popen("djpeg 2.jpg","r");
fscanf(fp,"%*s%d%d%*s%*c",&im->W,&im->H);
im->data=(unsigned char*)malloc(im->W*im->H*3);
fread(im->data,1,im->W*im->H*3,fp);
pclose(fp);
}
void ImageRead2(Image*im){
FILE *fp=popen("1.ppm","r");
scanf("%*s%d%d%*s%*c",&im->W,&im->H);
im->data=(unsigned char*)malloc(im->W*im->H*3);
fread(im->data,1,im->W*im->H*3,stdin);
pclose(fp);
}
void ViewerImageWrite(Viewer*vw,Image*im){
int i,j,p;
for(i=0;i<im->H;i++) for(j=0;j<im->W;j++) {
int r=im->data[(i*im->W+j)*3+0] >> 3,
g=im->data[(i*im->W+j)*3+1] >> 2,
b=im->data[(i*im->W+j)*3+2] >> 3;
vw->data[i*vw->W+j]=r << 11 | g << 5 | b;
}
}
void ImageInit(Image*im,int _W,int _H){
im->W = _W,
im->H = _H;
im->data=(unsigned char*)malloc(im->W*im->H*3);
}
void ImageClear(Image*im){
memset(im->data,0,im->W*im->H*3);
}
void ImageImageProjectionAlpha(Image*vw,Image*im,double a[3][3],double alpha){
int i,j,u,v;
double r;
for(i=0;i<vw->H;i++) for(j=0;j<vw->W;j++){
r = 1 / (a[2][0]*j+a[2][1]*i+a[2][2]);
u = r * (a[0][0]*j+a[0][1]*i+a[0][2]);
v = r * (a[1][0]*j+a[1][1]*i+a[1][2]);
if( (unsigned)u < im->W &&
(unsigned)v < im->H ){
vw->data[(i*vw->W+j)*3+0] += im->data[(v*im->W+u)*3+0]*alpha,
vw->data[(i*vw->W+j)*3+1] += im->data[(v*im->W+u)*3+1]*alpha,
vw->data[(i*vw->W+j)*3+2] += im->data[(v*im->W+u)*3+2]*alpha;
}
}}
main(){
Viewer vw;
Image im,im2;
ImageInit(&im2,1024,768);
ImageClear(&im2);
{ double a0[][3]={
1,0,-100,
0,1,-100,
0,0,1
};
ImageRead0(&im);
/* ImageRead(&im,"0.jpg");*/
ImageImageProjectionAlpha(&im2,&im,a0,.5); }
{ double a1[][3]={
0.796910, 0.013813, 169.305364,
-0.086703, 0.916091, -52.225765,
-0.000234, -0.000003,1 };
double a2[][3]={
0.696127, 0.021832, 93.979992,
-0.136842, 0.840445, -35.298567,
-0.000409, -0.000026,1
};
double a3[][3]={
0.885510,-0.014031,177.340823,-0.066359,0.956894,-59.078033,-0.000094,-0.000023,1
};
ImageRead1(&im);
/* ImageRead(&im,"1.jpg");*/
ImageImageProjectionAlpha(&im2,&im,a3,.5);
}
ViewerInit(&vw,im2.W,im2.H);
ViewerImageWrite(&vw,&im2);
ViewerLoop(&vw);
printf("P6 %d %d 255 ",im2.W,im2.H);
fwrite(&im2,im2.W*im2.H,1,stdout);
}
書き込みをするには、注意書きをよく読んでからにしてください