atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
prepress-tips
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
prepress-tips
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
prepress-tips
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • prepress-tips
  • GTK+ で openCV

prepress-tips

GTK+ で openCV

最終更新:2010年10月17日 11:24

Bot(ページ名リンク)

- view
管理者のみ編集可
最終更新日時: 2010/10/17   
 このページは 作成中です。
 
  • 開発環境
  • 教科書
  • GTK+ のライセンス
  • openCV のライセンス
  • ex01
  • ex01_gtk
  • openCV に日本語文字を描画
  • 開発環境
  • 教科書
  • GTK+ のライセンス
  • openCV のライセンス
  • ex01
  • ex01_gtk
  • openCV に日本語文字を描画
Edit

開発環境

  • 開発環境は Ubuntu 10.04 LTS ( ubuntu LiveUSB で利用 )。
    • openCV は簡単にインストールできる。
    • その他に必要なものも ほぼ最初から入っている。
      ( なくても簡単に追加インストールできる。 )

Tera Term から ssh でログインしたとき 最初に
export DISPLAY=:0.0

戻すときは
export DISPLAY=localhost:10.0

ヘルプ
devhelp &
firefox http://opencv.jp/opencv-2svn/c/ &

コンパイル
gcc -o [実行ファイル] [ソースファイル] `pkg-config gtk+-2.0 opencv --cflags --libs`

教科書

  • 次の2冊。どちらも 初心者にはとてもわかりやすい。
  • 入門GTK+
  • Essential OpenCV Programming with Visual C++ 2008

GTK+ のライセンス

  • GTK+ のライセンスは GNU LGPL 2.1 。
  • このページのプログラムも このライセンスに準じる。

openCV のライセンス

  • openCV のライセンスは 以下のとおり。
  • このページのプログラムも このライセンスに準じる。
license.txt
IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.

 By downloading, copying, installing or using the software you agree to this license.
 If you do not agree to this license, do not download, install,
 copy or use the software.


                          License Agreement
               For Open Source Computer Vision Library

Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
Copyright (C) 2008-2010, Willow Garage Inc., all rights reserved.
Third party copyrights are property of their respective owners.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

  * Redistribution's of source code must retain the above copyright notice,
    this list of conditions and the following disclaimer.

  * Redistribution's in binary form must reproduce the above copyright notice,
    this list of conditions and the following disclaimer in the documentation
    and/or other materials provided with the distribution.

  * The name of the copyright holders may not be used to endorse or promote products
    derived from this software without specific prior written permission.

This software is provided by the copyright holders and contributors "as is" and
any express or implied warranties, including, but not limited to, the implied
warranties of merchantability and fitness for a particular purpose are disclaimed.
In no event shall the Intel Corporation or contributors be liable for any direct,
indirect, incidental, special, exemplary, or consequential damages
(including, but not limited to, procurement of substitute goods or services;
loss of use, data, or profits; or business interruption) however caused
and on any theory of liability, whether in contract, strict liability,
or tort (including negligence or otherwise) arising in any way out of
the use of this software, even if advised of the possibility of such damage.

ex01

  • 画像を読み込み表示するプログラム。モノクロで表示する機能付き。
  • 先ほどの書籍のサンプルを ubuntu で実行できるよう修正したもの。
    • Essential OpenCV Programming with Visual C++ 2008
Edit
ex01_index.txt
* 変数の定義 /
    ? WIN
    ? img_src
    ? Form1

* 関数の定義 /
    ? btnLoad_Click //
    ? btnGray_Click //
    ? btnReset_Click //

    ? Form1_Load //
    ? Form1_FormClosed //

    ? Form1 - quit //
        / Form1_FormClosed ;

* 処理 /
    / Form1 - new
        ? Form1 - vbox //
        ? Form1 - hbox1 //
            ? Form1 - btnLoad //
        ? Form1 - hbox2 //
            ? Form1 - btnGray //
            ? Form1 - btnReset //
        / Form1_Load ;
    / Form1 - run

/name ex01.cpp ubuntu版 / ex01.c
// このプログラムは 以下の書籍のサンプルを ubuntu で実行できるよう修正したものです。
//    Essential OpenCV Programming with Visual C++ 2008
//    http://www.cutt.co.jp/book/978-4-87783-232-2.html

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <gtk/gtk.h>

/ 変数の定義
/ 関数の定義

int main ( int argc , char* argv[] ) {
    gtk_init ( &argc , &argv ) ;
    / 処理
    return 0 ;
}

/name 未指定 /
/use ex01_detail.txt

ex01_detail.txt - btn_Click / WIN / img_src / img_gray
/?- btn_Click , WIN , img_src , img_gray

* btnLoad_Click // void btnLoad_Click ( )
    ? openFileDialog1 - new //
        / openFileDialog1 - show
    ? openFileDialog1 - result //
        / if( ! openFileDialog1 - result OK ) { openFileDialog1 - free ; return ; }
    ? fname - from openFileDialog1 //
        / openFileDialog1 - free
    / img_src - load fname
        / img_src - show
        / fname -free

* btnGray_Click // void btnGray_Click ( )
    ? img_gray - new //
        / img_gray - from img_src
        / img_gray - show
    / img_gray - free

* btnReset_Click // void btnReset_Click ( )
    / img_src - show

* Form1_Load // void Form1_Load ( )
    / WIN - new

* Form1_FormClosed // void Form1_FormClosed ( )
    / WIN - close
    / img_src - free

* WIN / gchar* WIN ="ex01" ;

* WIN - new /
    cvNamedWindow( WIN , CV_WINDOW_AUTOSIZE ) ;

* WIN - close /
    cvDestroyWindow( WIN ) ;

* img_src / IplImage* img_src ;

* img_src - free /
    cvReleaseImage( &img_src ) ;

* img_src - load fname /
    img_src = cvLoadImage( fname ,
        CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR
    ) ;

* img_src - show /
    cvShowImage( WIN , img_src ) ;

* img_gray - new // IplImage* img_gray ;

* img_gray - from img_src /
    img_gray = cvCreateImage(
        cvGetSize( img_src ) , IPL_DEPTH_8U , 1
    ) ;
    cvCvtColor( img_src , img_gray , CV_BGR2GRAY ) ;

* img_gray - free /
    cvReleaseImage( &img_gray ) ;

* img_gray - show /
    cvShowImage( WIN , img_gray ) ;

ex01_detail.txt - openFileDialog1 / fname / Form1
/?- openFileDialog1 , fname , Form1

* openFileDialog1 - new // GtkWidget* openFileDialog1 ;
    openFileDialog1 = gtk_file_chooser_dialog_new(
        "load image" , GTK_WINDOW( Form1 ) ,
        GTK_FILE_CHOOSER_ACTION_OPEN ,
        GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL ,
        GTK_STOCK_OPEN , GTK_RESPONSE_ACCEPT ,
        NULL
    );

* openFileDialog1 - show /
    gtk_widget_show_all( openFileDialog1 ) ;

* openFileDialog1 - result // gint openFileDialog1_result ;
    openFileDialog1_result = gtk_dialog_run(
        GTK_DIALOG( openFileDialog1 )
    ) ;

* openFileDialog1 - result OK /
    ( openFileDialog1_result == GTK_RESPONSE_ACCEPT )

* openFileDialog1 - free /
    gtk_widget_destroy( openFileDialog1 ) ;

* fname - from openFileDialog1 // gchar* fname ;
    fname = gtk_file_chooser_get_filename(
        GTK_FILE_CHOOSER( openFileDialog1 )
    ) ;

* fname -free /
    g_free( fname ) ;

* Form1 / GtkWidget* Form1 ;

* Form1 - new /
    Form1 = gtk_window_new( GTK_WINDOW_TOPLEVEL ) ;
    gtk_window_set_title ( GTK_WINDOW( Form1 ) , "Form1" ) ;
    gtk_widget_set_size_request( Form1 , 160 , 80 ) ;
    g_signal_connect( G_OBJECT( Form1 ) ,
        "destroy" , G_CALLBACK( Form1_quit ) , NULL
    ) ;

* Form1 - run /
    gtk_widget_show_all( Form1 ) ;
    gtk_main() ;

* Form1 - quit // void Form1_quit ( )
    gtk_main_quit () ;

* Form1 - vbox // GtkWidget* vbox ;
    vbox = gtk_vbox_new( FALSE , 3 ) ;
    gtk_container_add( GTK_CONTAINER( Form1 ) , vbox ) ;
    gtk_container_set_border_width( GTK_CONTAINER( vbox ) , 6 ) ;

* Form1 - hbox1 // GtkWidget* hbox1 ;
    hbox1 = gtk_hbox_new( FALSE , 5 ) ;
    gtk_box_pack_start( GTK_BOX( vbox ) , hbox1 , TRUE , FALSE , 2 ) ;

* Form1 - hbox2 // GtkWidget* hbox2 ;
    hbox2 = gtk_hbox_new( FALSE , 0 ) ;
    gtk_box_pack_start( GTK_BOX( vbox ) , hbox2 , TRUE , FALSE , 2 ) ;

* Form1 - btnLoad // GtkWidget* btnLoad ;
    btnLoad = gtk_button_new_with_label( "画像読込" ) ;
    gtk_box_pack_start( GTK_BOX( hbox1 ) , btnLoad , FALSE , FALSE , 6 ) ;
    g_signal_connect( G_OBJECT( btnLoad ) , "clicked" ,
        G_CALLBACK( btnLoad_Click ) , NULL
    ) ;

* Form1 - btnGray // GtkWidget* btnGray ;
    btnGray = gtk_button_new_with_label( " モノクロ " ) ;
    gtk_box_pack_start( GTK_BOX( hbox2 ) , btnGray , FALSE , FALSE , 6 ) ;
    g_signal_connect( G_OBJECT( btnGray ) , "clicked" ,
        G_CALLBACK( btnGray_Click ) , NULL
    ) ;

* Form1 - btnReset // GtkWidget* btnReset ;
    btnReset = gtk_button_new_with_label( "元に戻す" ) ;
    gtk_box_pack_start( GTK_BOX( hbox2 ) , btnReset , FALSE , FALSE , 6 ) ;
    g_signal_connect( G_OBJECT( btnReset ) , "clicked" ,
        G_CALLBACK( btnReset_Click ) , NULL
    ) ;


ex01_gtk

  • 画像を読み込み モノクロ変換し 保存するプログラム。
  • 先ほどのプログラムに 保存機能を加え 全面的に書き直したもの。
    ソースを少し修正すれば チャネルミキシングなども試せる。
Edit
ex01_gtk_index.txt
* 変数の定義 /
    ? 画像ウィンドウ
    ? 操作パネル
    ? 元画像
    ? 変換画像

* 関数の定義 /
    ? 画像読込ボタン - onClick
        ? 選択ダイアログ - new load //
            / 選択ダイアログ - show
        ? 選択ダイアログ - result //
            / if( 選択ダイアログ - cancel ) { 選択ダイアログ - free ; return ; }
            / 選択ダイアログ - set 元画像 fname ; 選択ダイアログ - free
        / 元画像 - free
            / 元画像 - new load
        / 画像ウィンドウ - 画像 free
            / 画像ウィンドウ - new 元画像 ; 画像ウィンドウ - show
    ? モノクロボタン - onClick
        / 変換画像 - free
            / 変換画像 - new ; 変換画像 - conv
        / 画像ウィンドウ - 画像 free
            / 画像ウィンドウ - new 変換画像 ; 画像ウィンドウ - show
    ? 元に戻すボタン - onClick
        / 画像ウィンドウ - 画像 free
            / 画像ウィンドウ - new 元画像 ; 画像ウィンドウ - show
    ? 画像保存ボタン - onClick
        / if( 変換画像 - 未変換 ) { return ; }
        ? 選択ダイアログ - new save //
            / 選択ダイアログ - show
        ? 選択ダイアログ - result //
            / if( 選択ダイアログ - cancel ) { 選択ダイアログ - free ; return ; }
            / 選択ダイアログ - set 変換画像 fname ; 選択ダイアログ - free
        / 変換画像 - save
    ? 操作パネル - quit //
        / 元画像 - free ; 変換画像 - free

* 処理 /
    / 操作パネル - new
        ? 操作パネル - vbox //
        ? 操作パネル - hbox1 //
            ? 操作パネル - 画像読込ボタン //
            ? 操作パネル - 画像保存ボタン //
        ? 操作パネル - hbox2 //
            ? 操作パネル - モノクロボタン //
            ? 操作パネル - 元に戻すボタン //
    / 画像ウィンドウ - new
        / 画像ウィンドウ - new canvas ; 画像ウィンドウ - show
    / 操作パネル - run

/name ex01.c gtk版 / ex01_gtk.c
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <gtk/gtk.h>

/ 変数の定義
/ 関数の定義

int main ( int argc , char* argv[] ) {
    gtk_init ( &argc , &argv ) ;
    / 処理
    return 0 ;
}

/name 未指定 /
/use ex01_gtk_detail.txt

ex01_gtk_detail.txt - 元画像 / 変換画像 / 変換
/?- 元画像

* 元画像 / gchar* img_src_fname ; GdkPixbuf* img_src ; IplImage* img_src_cv ;

* 元画像 - fname / img_src_fname

* 元画像 - new load /
    img_src = gdk_pixbuf_new_from_file( img_src_fname , NULL ) ;
    ? 元画像 - w , h , ch , rs //
    img_src_cv = cvCreateImageHeader( cvSize( img_w, img_h ) , IPL_DEPTH_8U, img_ch );
    img_src_cv -> imageData = gdk_pixbuf_get_pixels( img_src ) ;
    g_free( img_src_fname ) ;

* 元画像 - free /
    if( img_src != NULL ) {
        cvReleaseImageHeader( &img_src_cv ) ;
        g_object_unref( G_OBJECT( img_src ) ) ;
    }

* 元画像 - w , h , ch , rs //
*~    gint img_w ; gint img_h ; gint img_ch ;  gint img_rs ;
    img_w = gdk_pixbuf_get_width( img_src ) ;
    img_h = gdk_pixbuf_get_height( img_src ) ;
    img_ch = gdk_pixbuf_get_n_channels( img_src ) ;
    img_rs = gdk_pixbuf_get_rowstride( img_src ) ;

/?- 変換画像

* 変換画像 / gchar* img_conv_fname ; GdkPixbuf* img_conv ; IplImage* img_conv_cv ;

* 変換画像 - fname / img_conv_fname

* 変換画像 - 未変換 /
    ( img_conv == NULL )

* 変換画像 - new /
    ? 元画像 - w , h , ch , rs //
    img_conv_cv = cvCreateImage( cvSize( img_w, img_h ) , IPL_DEPTH_8U, 3 );
    img_conv = gdk_pixbuf_new_from_data(
        img_conv_cv -> imageData , GDK_COLORSPACE_RGB , FALSE , 8 ,
        img_w , img_h , img_conv_cv -> widthStep , NULL , NULL
    );

* 変換画像 - free /
    if( img_conv != NULL ) {
        cvReleaseImage( &img_conv_cv ) ;
        g_object_unref( G_OBJECT( img_conv ) ) ;
    }

* 変換画像 - conv /
    / いろいろな変換 - rgb to gray

* いろいろな変換 - rgb to bgr /
    cvCvtColor( img_src_cv , img_conv_cv , CV_RGB2BGR ) ;

* いろいろな変換 - rgb to gray /
    IplImage* img_gray_cv ;
    img_gray_cv = cvCreateImage( cvSize( img_w, img_h ) , IPL_DEPTH_8U, 1 ) ;
    cvCvtColor( img_src_cv , img_gray_cv , CV_RGB2GRAY ) ;
    cvCvtColor( img_gray_cv , img_conv_cv , CV_GRAY2RGB ) ;
    cvReleaseImage( &img_gray_cv ) ;

* いろいろな変換 - rgb to gray 2 /
    CvMat* rgb_2_bgr ;
    rgb_2_bgr = cvCreateMat( img_ch , img_ch , CV_32FC1 ) ;
    cvSetZero( rgb_2_bgr ) ;
    cvmSet( rgb_2_bgr , 0 , 2 , 1.0 ) ;
    cvmSet( rgb_2_bgr , 1 , 1 , 1.0 ) ;
    cvmSet( rgb_2_bgr , 2 , 0 , 1.0 ) ;

    CvMat* offset ;
    offset = cvCreateMat( img_ch , 1 , CV_32FC1 ) ;
    cvSet( offset , cvScalarAll( 0.0 ) , NULL ) ; // cvSetZero( offset )

    IplImage* img_bgr_cv ; IplImage* img_gray_cv ;
    img_bgr_cv = cvCreateImage( cvSize( img_w, img_h ) , IPL_DEPTH_8U, img_ch ) ;
    img_gray_cv = cvCreateImage( cvSize( img_w, img_h ) , IPL_DEPTH_8U, 1 ) ;

    cvTransform( img_src_cv , img_bgr_cv , rgb_2_bgr , offset ) ;
    cvCvtColor( img_bgr_cv , img_gray_cv , CV_BGR2GRAY ) ;

    cvReleaseImage( &img_bgr_cv ) ; cvReleaseImage( &img_gray_cv ) ;
    cvReleaseMat( &rgb_2_bgr ) ; cvReleaseMat( &offset ) ;

* 変換画像 - save /
    gdk_pixbuf_save( img_conv , img_conv_fname ,
        "tiff" , NULL , "compression" , "5" , NULL // LZW
    ) ;
    g_free( img_conv_fname ) ;


ex01_gtk_detail.txt - 画像ウィンドウ / 操作パネル / 選択ダイアログ
/?- 画像ウィンドウ

* 画像ウィンドウ / GtkWidget* WIN_img ; GtkWidget* WIN_canvas ; GtkWidget* WIN ;

* 画像ウィンドウ - new /
    WIN = gtk_window_new( GTK_WINDOW_TOPLEVEL ) ;
    gtk_window_set_title( GTK_WINDOW( WIN ) , "画像" ) ;
    gtk_window_set_default_size( GTK_WINDOW( WIN ) , 400 , 300 ) ;
    gtk_window_move( GTK_WINDOW( WIN ) , 0 , 140 ) ;

* 画像ウィンドウ - show /
    gtk_widget_show_all( WIN ) ;

* 画像ウィンドウ - new canvas /
    WIN_canvas = gtk_scrolled_window_new( NULL , NULL ) ;
    gtk_scrolled_window_set_placement(
        GTK_SCROLLED_WINDOW ( WIN_canvas ) ,
        GTK_CORNER_TOP_LEFT
    ) ;
    gtk_scrolled_window_set_policy (
        GTK_SCROLLED_WINDOW ( WIN_canvas ) ,
        GTK_POLICY_AUTOMATIC , GTK_POLICY_AUTOMATIC
    ) ;
    gtk_container_add ( GTK_CONTAINER( WIN ) , WIN_canvas ) ;

* 画像ウィンドウ - new 元画像 /
    WIN_img = gtk_image_new_from_pixbuf( img_src ) ;
    gtk_scrolled_window_add_with_viewport(
        GTK_SCROLLED_WINDOW ( WIN_canvas ) , WIN_img
    ) ;

* 画像ウィンドウ - new 変換画像 /
    WIN_img = gtk_image_new_from_pixbuf( img_conv ) ;
    gtk_scrolled_window_add_with_viewport(
        GTK_SCROLLED_WINDOW ( WIN_canvas ) , WIN_img
    ) ;

* 画像ウィンドウ - 画像 free /
    if( WIN_img != NULL ) {
        gtk_object_destroy( GTK_OBJECT( WIN_img ) ) ;
    }

/?- 操作パネル

* 操作パネル / GtkWidget* Panel ;

* 操作パネル - new /
    Panel = gtk_window_new( GTK_WINDOW_TOPLEVEL ) ;
    gtk_window_set_title ( GTK_WINDOW( Panel ) , "操作パネル" ) ;
    gtk_widget_set_size_request( Panel , 170 , 80 ) ;
    g_signal_connect( G_OBJECT( Panel ) ,
        "destroy" , G_CALLBACK( Panel_quit ) , NULL
    ) ;

* 操作パネル - run /
    gtk_widget_show_all( Panel ) ;
    gtk_main() ;

* 操作パネル - quit // void Panel_quit ( )
    gtk_main_quit () ;

* 操作パネル - vbox // GtkWidget* vbox ;
    vbox = gtk_vbox_new( FALSE , 3 ) ;
    gtk_container_add( GTK_CONTAINER( Panel ) , vbox ) ;
    gtk_container_set_border_width( GTK_CONTAINER( vbox ) , 6 ) ;

* 操作パネル - hbox1 // GtkWidget* hbox1 ;
    hbox1 = gtk_hbox_new( FALSE , 0 ) ;
    gtk_box_pack_start( GTK_BOX( vbox ) , hbox1 , TRUE , FALSE , 2 ) ;

* 操作パネル - hbox2 // GtkWidget* hbox2 ;
    hbox2 = gtk_hbox_new( FALSE , 0 ) ;
    gtk_box_pack_start( GTK_BOX( vbox ) , hbox2 , TRUE , FALSE , 2 ) ;

* 操作パネル - 画像読込ボタン // GtkWidget* buttonLoad ;
    buttonLoad = gtk_button_new_with_label( "画像読込" ) ;
    gtk_box_pack_start( GTK_BOX( hbox1 ) , buttonLoad , FALSE , FALSE , 6 ) ;
    g_signal_connect( G_OBJECT( buttonLoad ) , "clicked" ,
        / G_CALLBACK( & 画像読込ボタン - onClick ) , NULL
    ) ;

* 操作パネル - 画像保存ボタン // GtkWidget* buttonSave ;
    buttonSave = gtk_button_new_with_label( "画像保存" ) ;
    gtk_box_pack_start( GTK_BOX( hbox1 ) , buttonSave , FALSE , FALSE , 6 ) ;
    g_signal_connect( G_OBJECT( buttonSave ) , "clicked" ,
        / G_CALLBACK( & 画像保存ボタン - onClick ) , NULL
    ) ;

* 操作パネル - モノクロボタン // GtkWidget* buttonGray ;
    buttonGray = gtk_button_new_with_label( " モノクロ " ) ;
    gtk_box_pack_start( GTK_BOX( hbox2 ) , buttonGray , FALSE , FALSE , 6 ) ;
    g_signal_connect( G_OBJECT( buttonGray ) , "clicked" ,
        / G_CALLBACK( & モノクロボタン - onClick ) , NULL
    ) ;

* 操作パネル - 元に戻すボタン // GtkWidget* buttonReset ;
    buttonReset = gtk_button_new_with_label( "元に戻す" ) ;
    gtk_box_pack_start( GTK_BOX( hbox2 ) , buttonReset , FALSE , FALSE , 6 ) ;
    g_signal_connect( G_OBJECT( buttonReset ) , "clicked" ,
        / G_CALLBACK( & 元に戻すボタン - onClick ) , NULL
    ) ;

* 画像読込ボタン - onClick // void buttonLoad_onClick ( )
* & 画像読込ボタン - onClick / buttonLoad_onClick

* モノクロボタン - onClick // void buttonGray_onClick ( )
* & モノクロボタン - onClick / buttonGray_onClick

* 元に戻すボタン - onClick // void buttonReset_onClick ( )
* & 元に戻すボタン - onClick / buttonReset_onClick

* 画像保存ボタン - onClick // void buttonSave_onClick ( )
* & 画像保存ボタン - onClick / buttonSave_onClick

/?- 選択ダイアログ

* 選択ダイアログ - new load // GtkWidget* file_dialog ;
    file_dialog = gtk_file_chooser_dialog_new(
        "画像選択" , GTK_WINDOW( Panel ) ,
        GTK_FILE_CHOOSER_ACTION_OPEN ,
        GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL ,
        GTK_STOCK_OPEN , GTK_RESPONSE_ACCEPT ,
        NULL
    );

* 選択ダイアログ - new save // GtkWidget* file_dialog ;
    file_dialog = gtk_file_chooser_dialog_new(
        "画像選択" , GTK_WINDOW( Panel ) ,
        GTK_FILE_CHOOSER_ACTION_SAVE ,
        GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL ,
        GTK_STOCK_SAVE , GTK_RESPONSE_ACCEPT ,
        NULL
    );
    gtk_file_chooser_set_current_name(
        GTK_FILE_CHOOSER( file_dialog ) , "untitled.tif"
    ) ;
    gtk_file_chooser_set_do_overwrite_confirmation(
        GTK_FILE_CHOOSER( file_dialog ) , TRUE
    ) ;

* 選択ダイアログ - show /
    gtk_widget_show_all( file_dialog ) ;

* 選択ダイアログ - free /
    gtk_widget_destroy( file_dialog ) ;

* 選択ダイアログ - result // gint file_dialog_result ;
    file_dialog_result = gtk_dialog_run(
        GTK_DIALOG( file_dialog )
    ) ;

* 選択ダイアログ - cancel /
    ( file_dialog_result != GTK_RESPONSE_ACCEPT )

* 選択ダイアログ - set 元画像 fname /
    / 元画像 - fname = gtk_file_chooser_get_filename(
        GTK_FILE_CHOOSER( file_dialog )
    ) ;

* 選択ダイアログ - set 変換画像 fname /
    / 変換画像 - fname = gtk_file_chooser_get_filename(
        GTK_FILE_CHOOSER( file_dialog )
    ) ;


openCV に日本語文字を描画

  • openCV に GTK+ で日本語文字を描画する。
draw_text.c
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <gtk/gtk.h>

// gcc -o draw_text draw_text.c `pkg-config gtk+-2.0 opencv --cflags --libs`
// ./draw_text

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

    gint img_w ; gint img_h ; // サイズ
    img_w = 260 ; img_h = 60 ;

    IplImage* img_org_cv ; // 元の画像 - openCV で作成
    img_org_cv = cvCreateImage( cvSize( img_w, img_h ) , IPL_DEPTH_8U, 3 );
    cvSet( img_org_cv , cvScalarAll( 255 ) , NULL ) ;

    GdkPixbuf* img_org ; // 元の画像 - pixbuf に変換
    img_org = gdk_pixbuf_new_from_data(
        img_org_cv -> imageData , GDK_COLORSPACE_RGB , FALSE , 8 ,
        img_w , img_h , img_org_cv -> widthStep , NULL , NULL
    );

    GdkPixmap* pixmap ; // 元の画像 - pixmap に変換
    gdk_pixbuf_render_pixmap_and_mask( img_org , &pixmap , NULL , 255 ) ;
    GdkColormap* colormap ; GdkGC* gc ;
    colormap = gdk_drawable_get_colormap( GDK_DRAWABLE( pixmap ) ) ;
    gc = gdk_gc_new( GDK_DRAWABLE( pixmap ) ) ;

    PangoFontDescription* font_desc ; // 描画情報 - フォントを指定
    font_desc = pango_font_description_from_string( "Arial Bold 14" ) ;

    gchar* markup_str ; // 描画情報 - 内容を指定
    markup_str = g_strdup_printf( "%s%s%s\x00" ,
        "<span font='14'>日本語文字を</span>" ,
        "<span background = 'red' foreground= 'yellow' font='20'>描画</span>" ,
        "<span font='14'>してみる</span>" ,
    "" ) ;

    PangoLayout* pango_layout ; // 描画情報 - pixmap に描画
    GtkWidget* area ;
    area = gtk_drawing_area_new() ;
    pango_layout = gtk_widget_create_pango_layout( GTK_WIDGET( area ) , "" ) ;
    pango_layout_set_markup( pango_layout , markup_str , -1 ) ;
    gdk_draw_layout( GDK_DRAWABLE( pixmap ) , gc , 10 , 10 , pango_layout ) ;

    gtk_object_destroy( GTK_OBJECT( area ) ) ;
    g_object_unref( G_OBJECT( colormap ) ) ;
    g_object_unref( G_OBJECT( gc ) ) ;
    g_free( markup_str ) ;

    GdkPixbuf* img_text ; // 描画情報 - pixbuf に変換
    img_text = gdk_pixbuf_get_from_drawable( NULL ,
        GDK_DRAWABLE( pixmap ) , NULL , 0 , 0 , 0 , 0 , img_w , img_h
    ) ;

    IplImage* img_text_cv ; // 描画情報 - openCV に変換
    img_text_cv = cvCreateImageHeader( cvSize( img_w , img_h ) , IPL_DEPTH_8U, 3 );
    img_text_cv -> imageData = gdk_pixbuf_get_pixels( img_text ) ;
    cvCvtColor( img_text_cv , img_text_cv , CV_RGB2BGR ) ;

     // 画面に表示 - openCV で
    cvNamedWindow( "openCVに GTK+で描画" , CV_WINDOW_AUTOSIZE  ) ;
    cvShowImage( "openCVに GTK+で描画" , img_text_cv ) ;

    cvWaitKey( 0 ) ;

    cvDestroyWindow( "openCVに GTK+で描画" ) ;

     // 終了
    cvReleaseImageHeader( &img_text_cv ) ;
    g_object_unref( G_OBJECT( img_text ) ) ;
    cvReleaseImage( &img_org_cv ) ;
    g_object_unref( G_OBJECT( img_org ) ) ;

    return 0 ;
}

Edit

「GTK+ で openCV」をウィキ内検索
LINE
シェア
Tweet
prepress-tips
記事メニュー
メニュー

更新履歴

取得中です。


記事メニュー2
右メニュー
  • トップページ
  • 旧トップページ
  • メニュー
  • 右メニュー
  • バックアップ


人気記事ランキング
  1. ImageJプラグインの作成 その2
  2. usb knoppix
  3. ソフト/wz_jsgraphics.js
  4. ImageJプラグインの作成
  5. 作成中
  6. 構造と処理を別の言語で書いて組合せる
  7. テスト
  8. サーバ/knoppix/nmap
  9. pdfファイルの調査
もっと見る
最近更新されたページ
  • 3840日前

    codeLayouter の記述メモ3
  • 3840日前

    トップページ
  • 5297日前

    codeLayouterを perlxsで使う
  • 5431日前

    GTK+ で openCV
  • 5431日前

    codeLayouter ver 0.03
  • 5438日前

    codeLayouter の記述メモ2
  • 5498日前

    ubuntu LiveUSB 3
  • 5571日前

    codeLayouter の記述メモ
  • 5612日前

    applescriptの編集
  • 5695日前

    ubuntu LiveUSB 2
もっと見る
人気記事ランキング
  1. ImageJプラグインの作成 その2
  2. usb knoppix
  3. ソフト/wz_jsgraphics.js
  4. ImageJプラグインの作成
  5. 作成中
  6. 構造と処理を別の言語で書いて組合せる
  7. テスト
  8. サーバ/knoppix/nmap
  9. pdfファイルの調査
もっと見る
最近更新されたページ
  • 3840日前

    codeLayouter の記述メモ3
  • 3840日前

    トップページ
  • 5297日前

    codeLayouterを perlxsで使う
  • 5431日前

    GTK+ で openCV
  • 5431日前

    codeLayouter ver 0.03
  • 5438日前

    codeLayouter の記述メモ2
  • 5498日前

    ubuntu LiveUSB 3
  • 5571日前

    codeLayouter の記述メモ
  • 5612日前

    applescriptの編集
  • 5695日前

    ubuntu LiveUSB 2
もっと見る
ウィキ募集バナー
急上昇Wikiランキング

急上昇中のWikiランキングです。今注目を集めている話題をチェックしてみよう!

  1. ゆるキャラ百科事典「ゆるペディア」
  2. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  3. beatmania IIDX SP攻略 @ wiki
  4. 東方同人CDの歌詞@Wiki
  5. グランツーリスモWiki
  6. モンスター烈伝オレカバトル@wiki
  7. イナズマイレブン 染岡さんと愉快な仲間たち wiki
  8. SQ用語辞典
  9. 魔法科高校の劣等生Wiki
  10. p5x 攻略wiki @ ウィキ
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 発車メロディーwiki
  5. 初音ミク Wiki
  6. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  7. 検索してはいけない言葉 @ ウィキ
  8. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  9. オレカバトル アプリ版 @ ウィキ
  10. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
もっと見る
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. MadTown GTA (Beta) まとめウィキ
  2. まどドラ攻略wiki
  3. シュガードール情報まとめウィキ
  4. R.E.P.O. 日本語解説Wiki
  5. Dark War Survival攻略
  6. SurrounDead 攻略 (非公式wiki)
  7. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  8. カツドンチャンネル @ Wiki
  9. Wplace Wiki
  10. AviUtl2のWiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 参加者一覧 - ストグラ まとめ @ウィキ
  2. 我孫子 清十郎 - ストグラ まとめ @ウィキ
  3. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  4. ウイングガンダムゼロ【EW】 - 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  5. 稼ぎ - 地球防衛軍6 @ ウィキ
  6. ミッション攻略 - 地球防衛軍6 @ ウィキ
  7. ウイングガンダムゼロ【EW】/ログ1 - 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  8. 不幸な少女03 - 検索してはいけない言葉 @ ウィキ
  9. サーヴァント/一覧/クラス別 - Fate/Grand Order @wiki 【FGO】
  10. MOZU - ストグラ まとめ @ウィキ
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.