static void area_main_update(area_context_t *context) { /* also setup the local error messages here, so they are */ /* updated for all entries at once */ gboolean sensitive; if(!context->bounds.valid()) { sensitive = FALSE; } else if(!context->bounds.normalized()) { gtk_label_set_text(GTK_LABEL(context->direct.error), _("\"From\" must be smaller than \"to\" value!")); gtk_label_set_text(GTK_LABEL(context->extent.error), _("Extents must be positive!")); sensitive = FALSE; } else { gtk_label_set_text(GTK_LABEL(context->direct.error), ""); gtk_label_set_text(GTK_LABEL(context->extent.error), ""); sensitive = TRUE; } gtk_dialog_set_response_sensitive(context->dialog, GTK_RESPONSE_ACCEPT, sensitive); /* check if area size exceeds recommended values */ if(selected_area(context) > WARN_OVER) gtk_widget_show(context->warning); else gtk_widget_hide(context->warning); }
static bool area_warning(area_context_t *context) { bool ret = true; /* check if area size exceeds recommended values */ double area = selected_area(context); if(area > WARN_OVER) { g_string text(warn_text(area)); const trstring msg = trstring("%1\n\nDo you really want to continue?").arg(text.get()); text.reset(); ret = osm2go_platform::yes_no(_("Area size warning!"), msg, MISC_AGAIN_ID_AREA_TOO_BIG | MISC_AGAIN_FLAG_DONT_SAVE_NO, context->dialog.get()); } return ret; }
static void on_area_warning_clicked(area_context_t *context) { double area = selected_area(context); g_string msg(warn_text(area)); warning_dlg(msg.get(), context->dialog.get()); }
int main(int argc, char *argv[]){ // 1. read image file char *filename = (argc >= 2) ? argv[1] : (char*)"/Users/naoto/git/opencv_gl/opencv/fruits.jpg"; original_image = cv::imread(filename);//多分ここら辺はすべてポインタ渡し。だからコピーする時は注意 if(original_image.empty()){ printf("ERROR: image not found!\n"); return 0; } //print hot keys printf( "Hot keys: \n" "\tESC or q - quit the program\n" "\tr - reverse mode\n" "\tz - undo reverse"); // 2. prepare window cv::namedWindow("image",1); // 3. prepare Mat objects for processing-mask and processed-image selected_image=original_image.clone(); // Matオブジェクトのクローンを生成する // 3. prepare Mat objects for processing-mask and processed-image // Matオブジェクトのクローンを生成する reverse_image=original_image.clone();// // 4. show image to window for generating mask cv::imshow("image", selected_image); // 5. set callback function for mouse operations cv::setMouseCallback("image", on_mouse,0);// マウス操作のコールバック関数を登録 3つ目の引数は //http://opencv.jp/opencv-2.2/py/highgui_user_interface.html どれがどれかは教科書見て bool loop_flag = true; while(loop_flag){ // 6. wait for key input int c = cv::waitKey(0); // 7. process according to input switch(c){ case 27://ESC case 'q': loop_flag = false; break; case 'r':{//{}にしないと、二つの変数のスコープがswitch文内になってしまうため、初期化されない可能性が //http://blog.livedoor.jp/bribser_dev/archives/4181608.html //矩形の一部分を変数に代入してくる。ポインタ渡し的なやつなので、元のデータの内容も書きかわる(浅いコピー?) //http://book.mynavi.jp/support/pc/opencv2/c3/opencv_img.html //ネガポジの反転 //cv::Mat(selected_data,selected_area) というのをマスクすれば良いのかな? cv::Rect selected_area(prev_pt,prev_end_pt); cv::Mat buf_input = selected_image(selected_area); cv::Mat buf_output = reverse_image(selected_area); cv::bitwise_not(buf_input, buf_output); cv::imshow("image", reverse_image); break;} case 'z'://ctrl+zだと思ってもらえれば 選択状態へ戻る cv::imshow("image", selected_image); reverse_image=original_image.clone(); selected=true; break; } } return 0; }