通常GUI Application在啟動後並不希望看到Console
此Console可在VS2008的專案-> 連結器 -> 系統 -> 子系統 (/SUBSYSTEM:WINDOWS)即可。
2011年1月26日 星期三
取消Console Application的Command Prompt
2010年9月6日 星期一
OpenCV影像顯示於Gtk介面
在OpenCV中影像結構被定義為IplImage
本篇紀錄如何將IplImage影像顯示於Gtk介面的Image物件
drawing.h#ifndef DRAWING_H_INCLUDED
#define DRAWING_H_INCLUDED
#include <gtkmm.h>
#include <cv.h>
#include <highgui.h>
class drawing : public Gtk::DrawingArea{
public:
drawing();
virtual ~drawing();
virtual bool on_expose_event(GdkEventExpose* event);
void SetImage(IplImage* img);
private:
IplImage* Image;
};
#endif // DRAWING_H_INCLUDED
drawing.cpp#include "drawing.h"
drawing::drawing():Image(NULL)
{
}
drawing::~drawing()
{
if(Image!=NULL)
cvReleaseImage(&Image);
}
bool drawing::on_expose_event(GdkEventExpose* event)
{
Glib::RefPtr
Glib::RefPtr
if(Image!=NULL){
window->draw_rgb_image(gc,0,0,Image->width,Image->height,Gdk::RGB_DITHER_NONE,(const guchar* )Image->imageData,Image->widthStep);
queue_draw();
Glib::usleep(30000);
}
return true;
}
void drawing::SetImage(IplImage* img)
{
if(img)
{
if(Image)
cvCopy(img,Image);
else
Image=cvCloneImage(img);
queue_draw();
}
}
main.cpp#include <iostream>
#include <gtkmm.h>
#include <libglademm.h>
#include <cv.h>
#include <highgui.h>
#include "drawing.h"
//#include "CameraDS.h"
Gtk::Window *window;
Gtk::VBox *box;
Gtk::Button *button;
Glib::Thread* thread;
drawing *pDraw;
static bool state=false;
void thread_func()
{
CvCapture* capture;
IplImage* img;
capture=cvCaptureFromCAM(CV_CAP_ANY);
while(state)
{
img=cvQueryFrame(capture);
cvCvtColor(img,img,CV_BGR2RGB);
pDraw->SetImage(img);
//std::cout << "width: " << width << " height: " << height << "\n"; } cvReleaseCapture(&capture); std::cout << "Thread excuted.\n"; } void on_my_clicked() { if(!state){ state=true; thread=Glib::Thread::create(sigc::ptr_fun(&thread_func),true); }else{ state=false; } std::cout << "clicked\n"; } int main(int argc, char *argv[]){ if(!Glib::thread_supported()) Glib::thread_init(); Gtk::Main main(argc,argv); Glib::RefPtr
refXml->get_widget("window1", window);
refXml->get_widget("vbox1", box);
refXml->get_widget("button1", button);
pDraw=new drawing();
button->signal_clicked().connect(sigc::ptr_fun(&on_my_clicked));
box->add(*pDraw);
//box->add(*button);
//window->add(box);
window->resize(800,600);
window->show_all();
main.run(*window);
return 0;
}
2009年3月26日 星期四
C語言監控IO
最近在寫R232的連線程式,一開始的做法是使用timer定期去抓buffer裡的資料
但由於程式要求的資料量不大,此方法會造成cpu無謂的loading
但最近再翻GTK時,突然發現一個好用的函式如下↓
gint gdk_input_add( gint source,GdkInputCondition condition,
GdkInputFunction function, gpointer data);
這個函式可以監控IO當資料有所進出時,可執行自訂函數。
參數1: source 即為檔案描述器
參數2: condition 為要監控的模式
GDK_INPUT_READ 當檔案描述器有資料可供讀取時,則執行自訂函數
GDK_INPUT_WRITE 當檔案描述器已準備好可寫入時,則執行自訂函數
參數3: function 自訂函數名稱
參數4: 傳入自訂函式之參數
回傳值: 傳回一個標籤tag,可用此標籤移除對IO的監控如下↓
void gdk_input_remove(gint tag);
自訂函式宣告格式:
void input_callback( gpointer data,
gint source,
GdkInputCondition condition );
原先使用timer方式讀取IO,CPU的負載平均30~40%左右
使用此方法負載確只有20%,很明顯此方式可有效降低負載。 :)