博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Just For Fun:闲来无事,C语言+GTK生成mnist数据集的图形用户界面GUI
阅读量:2031 次
发布时间:2019-04-28

本文共 8150 字,大约阅读时间需要 27 分钟。

这几天心血来潮,想看看DL和CNN,于是乎在GitHub上搜了搜,好多数字识别的CNN,但是无一例外都需要mnist数据集,但是一般的数据集都是二进制binary的基本看不了。所以我就试着写了一个生成二进制float文件的GTK-GUI,希望对大家有个参考价值,也给自己做个备份。

还是老样子,先上:

/*GTK drawing ,output binary file for CNN or DeepLearning and so on.**          I just modify Peter Mattis's initial drawing code,*                        Rong Tao 2018.03.18**   first code as following discription:**//* GTK - The GIMP Toolkit* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald** This library is free software; you can redistribute it and/or* modify it under the terms of the GNU Lesser General Public* License as published by the Free Software Foundation; either* version 2 of the License, or (at your option) any later version.** This library is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   See the GNU* Lesser General Public License for more details.** You should have received a copy of the GNU Lesser General Public* License along with this library; if not, write to the* Free Software Foundation, Inc., 59 Temple Place - Suite 330,* Boston, MA 02111-1307, USA.*//** Modified by the GTK+ Team and others 1997-2000.   See the AUTHORS* file for a list of people on the GTK+ Team.   See the ChangeLog* files for a list of changes.   These files are distributed with* GTK+ at ftp://ftp.gtk.org/pub/gtk/. */#include 
#include
#include
/* main window */static GtkWidget *window = NULL;/* Backing pixmap for drawing area */static GdkPixmap *pixmap = NULL;/* Information about cursor */static gint cursor_proximity = TRUE;static gdouble cursor_x;static gdouble cursor_y;/* Unique ID of current device */static GdkDevice *current_device;static const int width = 64;static const int height = 64;static const int offset=1;static const int windowWidth = 300;static const int windowHeight = 300;static const char *filename = "binary";static float *array ;/* Erase the old cursor, and/or draw a new one, if necessary */static void update_cursor (GtkWidget *widget, gdouble x, gdouble y){ static gint cursor_present = 0; gint state = !current_device->has_cursor && cursor_proximity; if (pixmap != NULL) { if (cursor_present && (cursor_present != state || x != cursor_x || y != cursor_y)) { gdk_draw_drawable (widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], pixmap, cursor_x - 5, cursor_y - 5, cursor_x - 5, cursor_y - 5, 10, 10); } cursor_present = state; cursor_x = x; cursor_y = y; if (cursor_present) { gdk_draw_rectangle (widget->window, widget->style->black_gc, TRUE, cursor_x - 5, cursor_y -5, 10, 10); } }}/* Create a new backing pixmap of the appropriate size */static gint configure_event (GtkWidget *widget, GdkEventConfigure *event){ if (pixmap) g_object_unref (pixmap); pixmap = gdk_pixmap_new(widget->window, widget->allocation.width, widget->allocation.height, -1); gdk_draw_rectangle (pixmap, widget->style->white_gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height); return TRUE;}/* Refill the screen from the backing pixmap */static gint expose_event (GtkWidget *widget, GdkEventExpose *event){ gdk_draw_drawable (widget->window, widget->style->fg_gc[GTK_WIDGET_STATE (widget)], pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); return FALSE;}/* Draw a rectangle on the screen, size depending on pressure, and color on the type of device */static void draw_brush (GtkWidget *widget, GdkInputSource source, gdouble x, gdouble y, gdouble pressure){ GdkGC *gc; GdkRectangle update_rect; switch (source) { case GDK_SOURCE_MOUSE: gc = widget->style->dark_gc[GTK_WIDGET_STATE (widget)]; break; case GDK_SOURCE_PEN: gc = widget->style->black_gc; break; case GDK_SOURCE_ERASER: gc = widget->style->white_gc; break; default: gc = widget->style->light_gc[GTK_WIDGET_STATE (widget)]; } int ix =(int)( ((((int)x)%windowWidth)*1.0/(windowWidth*1.0)*width)); int iy =(int)( ((((int)y)%windowHeight)*1.0/(windowHeight*1.0)*height)); int i,j; for(i=ix-offset;i
=0&&i
=0&&j
window, TRUE);}static guint32 motion_time;static void print_axes (GdkDevice *device, gdouble *axes){ int i; if (axes) { g_print ("%s ", device->name); for (i=0; i
num_axes; i++) g_print ("%g ", axes[i]); g_print ("\n"); }}static gint button_press_event (GtkWidget *widget, GdkEventButton *event){ current_device = event->device; cursor_proximity = TRUE; if (event->button == 1 && pixmap != NULL) { gdouble pressure = 0.5; print_axes (event->device, event->axes); gdk_event_get_axis ((GdkEvent *)event, GDK_AXIS_PRESSURE, &pressure); draw_brush (widget, event->device->source, event->x, event->y, pressure); motion_time = event->time; } update_cursor (widget, event->x, event->y); return TRUE;}static gint key_press_event (GtkWidget *widget, GdkEventKey *event){ if ((event->keyval >= 0x20) && (event->keyval <= 0xFF)) printf("I got a %c\n", event->keyval); else printf("I got some other key\n"); return TRUE;}static gint motion_notify_event (GtkWidget *widget, GdkEventMotion *event){ GdkTimeCoord **events; int n_events; int i; current_device = event->device; cursor_proximity = TRUE; if (event->state & GDK_BUTTON1_MASK && pixmap != NULL) { if (gdk_device_get_history (event->device, event->window, motion_time, event->time, &events, &n_events)) { for (i=0; i
device, events[i]->axes, GDK_AXIS_X, &x); gdk_device_get_axis (event->device, events[i]->axes, GDK_AXIS_Y, &y); gdk_device_get_axis (event->device, events[i]->axes, GDK_AXIS_PRESSURE, &pressure); draw_brush (widget, event->device->source, x, y, pressure); print_axes (event->device, events[i]->axes); } gdk_device_free_history (events, n_events); } else { double pressure = 0.5; gdk_event_get_axis ((GdkEvent *)event, GDK_AXIS_PRESSURE, &pressure); draw_brush (widget, event->device->source, event->x, event->y, pressure); } motion_time = event->time; } if (event->is_hint) gdk_device_get_state (event->device, event->window, NULL, NULL); print_axes (event->device, event->axes); update_cursor (widget, event->x, event->y); return TRUE;}/* We track the next two events to know when we need to draw a cursor */static gint proximity_out_event (GtkWidget *widget, GdkEventProximity *event){ cursor_proximity = FALSE; update_cursor (widget, cursor_x, cursor_y); return TRUE;}static gint leave_notify_event (GtkWidget *widget, GdkEventCrossing *event){ cursor_proximity = FALSE; update_cursor (widget, cursor_x, cursor_y); return TRUE;}void input_dialog_destroy (GtkWidget *w, gpointer data){ *((GtkWidget **)data) = NULL;}void create_output_dialog (void){ GtkWidget *dialog; static gint saveCount = 1; dialog = gtk_message_dialog_new (GTK_WINDOW (window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, GTK_BUTTONS_OK, "Panel save as file: \"binary\"\n" ); gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "number of times: %d\n"\ "please use ./ximage to\n"\ "the binary file to image\n"\ " run ./ximage for help\n", saveCount); gtk_dialog_run (GTK_DIALOG (dialog)); gtk_widget_destroy (dialog); FILE *fp = fopen(filename,"wb"); fwrite(array,sizeof(float),width*height,fp); fclose(fp); saveCount++;}void quit (void) { gtk_main_quit (); }int main (int argc, char *argv[]){ array= (float*)malloc(sizeof(float)*width*height); int i; for(i=0;i

Makefile内容如下:

gtk=`pkg-config --cflags --libs gtk+-2.0`CC=gccIFILE=drawArea.cALL:	$(CC) $(IFILE) $(gtk) 	./a.out

然后跳出GUI界面,通过单击鼠标进行手写:

         

然后用CWP的指令ximage显示这个生成的二进制文件“binary”:

$ ximage < binary n1=64 perc=99

下面给出一些其他的例子:

你可能感兴趣的文章
18-io_ctags配置
查看>>
1-安卓底层-基础
查看>>
事务隔离性级别
查看>>
详细了解volatile关键字
查看>>
如何使用linux命令定位高占用java程序
查看>>
笔记-机器学习-1
查看>>
笔记-python-动态添加属性
查看>>
笔记-twisted-adbapi-scrapy
查看>>
笔记-python-lib—data types-enum
查看>>
笔记-jinja2语法
查看>>
笔记-django-视图
查看>>
一致性Hash算法
查看>>
flask_migrate
查看>>
flask_script
查看>>
threading.local
查看>>
flask上下文
查看>>
Linux的SOCKET编程详解
查看>>
setsid()函数的作用
查看>>
每天进步一点点——Linux中的线程局部存储(二)
查看>>
【C++】explicit关键字
查看>>