Homeへ


アルミ板を加工して単眼鏡装着
ノーマルではだいぶ広角なので、Kenko7x8の単眼鏡(1,000円前後でお手軽)をアルミ板を加工して着けてみました。 ノーマル画像の真中に白く見えるものが単眼鏡使用後の画像です。かなり拡大されましたが、周囲が暗く中心部がややボケています。また遠距離では色も薄くフォーカスが甘くなります。
ノーマル 単眼鏡使用後 単眼鏡使用 オリジナル

カメラ分解、CCD基板を取付けたアルミカバーを蓋に取り付け
単眼鏡での不満解消のため、一眼レフに挑戦です。一眼レフが使用できるか友人に借りて確認する事ができました。友人に感謝!
カメラの分解は初めてでしたが、ケースとして使うので思い切って挑戦!。結構大変でした。
CCD基板が干渉しないようにかなりカメラのフレームを削り、試行錯誤でなんとか組み込む事ができました。CCD基板はCCDのフィルター部の上下のネジ穴を利用してアルミ板に取り付け、そのアルミカバーをカメラの蓋に取付けました。
カメラはジャンクでPENTAX ME super、レンズは中古TokinaAF 28-80mm F3.5-5.6です。ボディ、レンズで7,000円。
大体フィルムの位置がCCDの位置です。レンズフォーカスの真中くらいでピントが合うように微調整していますがかなり微妙でした。
一眼レフのレンズは70mmの場合70mm/35mm=2倍という事なので、このレンズの場合CCDではおよそ28mm/5mm=5.6倍から-80/5=16倍という事になります。
後でMC-CPL(円偏光フィルタ)も加えましたが効果はよく分かりませんでした。フィルタって結構高いですが、2,780円の物を見つけました。価格で性能差有るんですかね?
やはり一眼レフのレンズは単眼鏡に比べて格段にいいですね。レンズは交換できるし、フィルタも着けれるし、絞りも使えます。ただこれでも問題があるので、次にプログラムを修正しました
本体、レンズ、MC-CPL CCDを中心にくるように設置 CCD基板はアルミ板に取付け 正面からは普通のカメラ
晴れているときの富士山(35mmくらいプログラム補正) 80mmプログラム補正、中古レンズのためカビが
プログラム改造前 改造後
使用しているプログラムは waxtv の webcam です。
このカメラは室内向けなので、屋外を撮影すると明るく白っぽくなってしまいます。(改造前の画像) レンズの絞りを調整しても、フィルタ MC-CPL を使用しても自動補正され同じような状態です。
そこで  webcam.c を改造し補正できるようにしました。
プログラムはadd_text関数、rotate_image関数を改造しました。
改造前の画像でも赤がやや強いようなので、プログラム中で各 RGBのコントラスト、明るさ補正値計算の部分で赤-0.15、緑-0.1と色相を調整しています。枠の色がグレーなので補正後の枠の色により色相の偏りが分かります。まだ調整が必要です。
現時点でカメラからの画像取得は10秒毎ですが、ramdiskを作成して保存、 httpd.conf  に画像ファイルへのアクセスを記録しないように SetEnvIf Request_URI \.gif image-request、SetEnvIf Request_URI \.jpg image-request、SetEnvIf Request_URI \.png image-request を追加してHDのアクセスを少なくしています。
SELinuxではプラウザから ramdisk のアクセスが禁止されているので、ポリシーを修正しなければなりません。ポリシーの修正には policy-source が必要です。


ポリシーの修正
# setenforce 0 <-モードの変更
# getenforce
permissive
# audit2allow -d
allow httpd_t xxxxxx <-この部分を apache.te に追加
# make reload <-ポリシーを反映させる
# setenforce 1 <-モードを戻す
# getenforce
enforcing
アクセスできるまで繰り返します。




webcam.cの改造
//表示用グローバル変数追加
double dcr;
double dbr;
double dcg;
double dbg;
double dcb;
double dbb;
//

//確認用に年月日、時間の後ろに補正値表示
add_text(char *image, int width, int height)
{
 time_t t;
 struct tm *tm;
 unsigned char line[MSG_MAXLEN+1],*ptr;
 int i,x,y,f,len;
//
 unsigned char cdc[16];
//
 time(&t);
 tm = localtime(&t);
 len = strftime(line,MSG_MAXLEN,get_message(),tm);

//各RGBのコントラスト、明るさ情報を追加
 strcat(line," ");
 gcvt(dcr,3,cdc);
 strcat(line,cdc);
 strcat(line," ");
 gcvt(dbr,3,cdc);
 strcat(line,cdc);

 strcat(line," ");
 gcvt(dcg,3,cdc);
 strcat(line,cdc);
 strcat(line," ");
 gcvt(dbg,3,cdc);
 strcat(line,cdc);

 strcat(line," ");
 gcvt(dcb,3,cdc);
 strcat(line,cdc);
 strcat(line," ");
 gcvt(dbb,3,cdc);
 strcat(line,cdc);
 len = strlen(line);
//



//各RGBのコントラスト、明るさ補正
rotate_image(unsigned char * in, int *wp, int *hp, int rot,
       int top, int left, int bottom, int right)
{
 static unsigned char * rotimg = NULL;

 int i, j;

 int w = *wp;
 int ow = (right-left);
 int oh = (bottom-top);

//補正用RGB変数追加
 unsigned char dlr,dhr,dlg,dhg,dlb,dhb;
 double rContrast,rBright;
 double gContrast,gBright;
 double bContrast,bBright;
 double dd;
 dlr=255;dhr=0;
 dlg=255;dhg=0;
 dlb=255;dhb=0;
//



//各RGBのコントラスト、明るさ補正
rotate_image(unsigned char * in, int *wp, int *hp, int rot,
       int top, int left, int bottom, int right)
{
 static unsigned char * rotimg = NULL;

 int i, j;

 int w = *wp;
 int ow = (right-left);
 int oh = (bottom-top);
 int ir;
 int or;

//補正用RGB変数追加
 unsigned char dlr,dhr,dlg,dhg,dlb,dhb;
 double rContrast,rBright;
 double gContrast,gBright;
 double bContrast,bBright;
 double dd;
 dlr=255;dhr=0;
 dlg=255;dhg=0;
 dlb=255;dhb=0;
//

 if (rotimg == NULL && (rotimg = malloc(ow*oh*3)) == NULL ) {
  fprintf(stderr, "out of memory\n");
  exit(1);
 }
 switch (rot) {
  default:
  case 0:
   //各RGBの最小値、最大値設定
   for (j = 0; j < oh; j++) {
    ir = (j+top)*w+left;
    for (i = 0; i < ow; i++) {
     if(in[3*(ir+i)] > 0 && dlr > in[3*(ir+i)])
         dlr = in[3*(ir+i)];
     if(in[3*(ir+i)+1] > 0 && dlg > in[3*(ir+i)+1])
         dlg = in[3*(ir+i)+1];
     if(in[3*(ir+i)+2] > 0 && dlb > in[3*(ir+i)+2])
         dlb = in[3*(ir+i)+2];

     if(dhr < in[3*(ir+i)]) dhr = in[3*(ir+i)];
     if(dhg < in[3*(ir+i)+1]) dhg = in[3*(ir+i)+1];
     if(dhb < in[3*(ir+i)+2]) dhb = in[3*(ir+i)+2];
    }
   }
//各RGBのコントラスト、明るさ補正値計算
   rContrast = 255.0/(dhr-dlr)-0.15; //赤-0.15
   rBright = (-dlr*255.0)/(dhr-dlr)+50;
   gContrast = 255.0/(dhg-dlg)-0.1;  //緑-0.1
   gBright = (-dlg*255.0)/(dhg-dlg)+50;
   bContrast = 255.0/(dhb-dlb);
   bBright = (-dlb*255.0)/(dhb-dlb)+50;

   //固定値テスト用
   /*
   rContrast = 1.68;
   rBright = -166;
   gContrast = 2.4;
   gBright = -270;
   bContrast = 2.2;
   bBright = -210;
   */

   //表示用グローバル変数に代入
   dcr=rContrast;
   dbr=rBright;
   dcg=gContrast;
   dbg=gBright;
   dcb=bContrast;
   dbb=bBright;

   //各RGBのコントラスト、明るさを反映
   for (j = 0; j < oh; j++) {
    ir = (j+top)*w+left;
    or = j*ow;
    for (i = 0; i < ow; i++) {
     dd = (in[3*(ir+i)])*rContrast+rBright;
     if (dd < 0) dd = 0;
     if (dd > 255) dd = 255;
     rotimg[3*(or + i)] = dd;

     dd = (in[3*(ir+i)+1])*gContrast+gBright;
     if (dd < 0) dd = 0;
     if (dd > 255) dd = 255;
     rotimg[3*(or + i)+1] = dd;

     dd = (in[3*(ir+i)+2])*bContrast+bBright;
     if (dd < 0) dd = 0;
     if (dd > 255) dd = 255;
     rotimg[3*(or + i)+2] = dd;
    }
   }
//
   *wp = ow;
   *hp = oh;
   break;
crontabを使って、1時間毎に画像を保存していす。
/etc/cron.hourlyフォルダにコピーの為のスクリプトを作成しました。コピーファイルは cam`date +%H`.jpg として時間をファイル名に追加しています。現在時間以降の画像は昨日のものです。

6:00

7:00

8:00

9:00

10:00

11:001

12:00

13:00

14:00

15:00

16:00

17:00

18:00
▲Page Top