gphoto2

gphotoというUnix/Linux系でカメラ制御できるソフトウェアがある

普段の研究でデジカメで撮影した画像を使っているので
自分たちでカメラ制御できたら、計測が自動化できるのではと考えた
そこで、gphotoというフロントインターフェイスを使わず
もとになっているlibgphotoっていうライブラリを直に使って制御しようと思う
しかし、意外とlibgphotoのライブラリを使っている人がいなくて情報が無い
いろいろ探した結果なんとか撮影して画像取得するまでは出来たが
だが、しかし結局使ってない

なんだか勿体無いので需要あるのかわからんが、参考になれば
全然libgphoto使ってる人居ないというのはgphotoのインターフェイスから使えるのでほぼ需要は満たされてるのかな

FreeBSD
Canon EOS 5D Mark2
Canon EOS 40D
で動作確認
確認したのはしばらく前なので、今現在動くかは不明

#include <gphoto2/gphoto2.h>

int cap(int cap_cnt) {
CameraFilePath path;
Camera *camera;
CameraAbilitiesList *al;
CameraAbilities abilities;
CameraText text;
GPContext *context;

CameraWidget* widget_root;
CameraWidget* widget_main;
CameraWidget* widget_settings;
CameraWidget* widget_imgsettings;
CameraWidget* widget_capturesettings;
CameraWidget* widget_value;
CameraWidgetType type;
const char *label, *name;

int value_int;
float value_float;
char value_char;
const char *model;
const char *port;

GPPortInfoList *infoList;
GPPortInfo info;
CameraList *list;

int res;
int i,n,ret;
char *current;

char buf[256],fimg[256];

gp_camera_new (&camera);
context = gp_context_new ();
gp_abilities_list_new (&al);
gp_abilities_list_load (al, context);
gp_port_info_list_new(&infoList);
system(“echo system check”);
gp_port_info_list_load(infoList);
gp_list_new(&list);
gp_abilities_list_detect(al,infoList,list,context);
if(gp_list_count(list)<=0){
printf (“Camera not detected\n”);
exit(0);
}
gp_list_get_name(list,0,&model);
int m = gp_abilities_list_lookup_model(al,model);
gp_list_get_value(list,0,&port);
int p = gp_port_info_list_lookup_path (infoList,port);

printf(“Detected %d cameras : name=’%s’ port=’%s’\n”,gp_list_count(list),model,port);

gp_abilities_list_get_abilities (al, m, &abilities);
gp_abilities_list_free (al);
// widget start

// General
res = gp_camera_get_config(camera, &widget_root, context);
if(res!=GP_OK) {printf(“01 – Code: %d – %s\n”, res, gp_result_as_string(res));}
res = gp_widget_get_child_by_name(widget_root, “main”, &widget_main);
if(res!=GP_OK) {printf(“02 – Code: %d – %s\n”, res, gp_result_as_string(res));}
res = gp_widget_get_child_by_name(widget_main, “settings”, &widget_settings);
if(res!=GP_OK) {printf(“03 – Code: %d – %s\n”, res, gp_result_as_string(res));}

// We enable capture
res = gp_widget_get_child_by_name(widget_settings, “capture”, &widget_value);
if(res!=GP_OK) {printf(“06 – Code: %d – %s\n”, res, gp_result_as_string(res));}
res = gp_widget_get_value (widget_value, &current);
value_int = 1;
res = gp_widget_set_value(widget_value, &value_int);
if(res!=GP_OK) {printf(“07 – Code: %d – %s\n”, res, gp_result_as_string(res));}
res = gp_widget_get_value (widget_value, &current);

// We commit the config
res = gp_camera_set_config(camera, widget_root, context);
if(res!=GP_OK) {printf(“commit – Code: %d – %s\n”, res, gp_result_as_string(res));}

res = gp_camera_get_config(camera, &widget_root, context);
res = gp_widget_get_child_by_name(widget_root, “main”, &widget_main);
// We look for more settings
res = gp_widget_get_child_by_name(widget_main, “imgsettings”, &widget_imgsettings);
if(res!=GP_OK) {printf(“08 – Code: %d – %s\n”, res, gp_result_as_string(res));}
res = gp_widget_get_child_by_name(widget_root, “capturesettings”, &widget_capturesettings);
if(res!=GP_OK) {printf(“09 – Code: %d – %s\n”, res, gp_result_as_string(res));}

// And we set image shutterspeed,aperture.
res = gp_widget_get_child_by_name(widget_capturesettings, “eos-shutterspeed”, &widget_value);
if(res!=GP_OK) {printf(“16 – Code: %d – %s\n”, res, gp_result_as_string(res));
printf(“16.5 – Code: %d – %s\n”, res, gp_result_as_string(res));}

if(res!=GP_OK) {printf(“17 – Code: %d – %s\n”, res, gp_result_as_string(res));}

res = gp_widget_get_child_by_name(widget_capturesettings, “eos-aperture”, &widget_value);
if(res!=GP_OK) {printf(“18 – Code: %d – %s\n”, res, gp_result_as_string(res));
printf(“18.5 – Code: %d – %s\n”, res, gp_result_as_string(res));}

if(res!=GP_OK) {printf(“19 – Code: %d – %s\n”, res, gp_result_as_string(res));}

res = gp_camera_set_config(camera, widget_root, context);
if(res!=GP_OK) {printf(“commit2 – Code: %d – %s\n”, res, gp_result_as_string(res));}

gp_camera_set_abilities (camera, abilities);

gp_port_info_list_get_info(infoList, p, &info);
gp_camera_set_port_info(camera, info);
gp_port_info_list_free( infoList );

gp_camera_init (camera, context);

res = gp_camera_capture (camera, GP_CAPTURE_IMAGE , &path, context);

printf (“cam_cap – Code: %d – %s\n”, res, gp_result_as_string(res));

if (res >= 0) {

CameraFile *cfile;
gp_file_new(&cfile);
gp_camera_file_get(camera, path.folder, path.name, GP_FILE_TYPE_NORMAL, cfile, context);
printf(“saveto\n”);
sprintf( buf, “%03d.jpg”,cap_cnt);
gp_file_save( cfile,buf );
printf(“saveto end\n”);
printf (“camera file %s%s save to %s\n”,path.folder,path.name,buf);
gp_file_unref( cfile );

}

gp_context_unref (context);
res = gp_camera_unref (camera);

return 0;
}

何かあればコメントでどうぞ

gphoto2」への1件のフィードバック

  1. you code is vary useful code

    I have to understand the code of the gphoto2 widget

    あなたに感謝している

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です