Home

OpenGL上的烟花

参考这个做的: http://blog.csdn.net/crazyjumper/archive/2007/10/19/1833483.aspx

只贴下数据结构

#define MAX_PARTICLES  24             // 小烟花个数
#define MAX_TAIL       30             // 烟花尾部长度
#define MAX_FIRE       5              // 烟花总个数
#define PI             3.1415926
#define COLOR_NUM      12

static GLfloat colors[COLOR_NUM][3]=  // 彩虹颜色
{
     {1.0f,0.5f,0.5f},{1.0f,0.75f,0.5f},{1.0f,1.0f,0.5f},{0.75f,1.0f,0.5f},
     {0.5f,1.0f,0.5f},{0.5f,1.0f,0.75f},{0.5f,1.0f,1.0f},{0.5f,0.75f,1.0f},
     {0.5f,0.5f,1.0f},{0.75f,0.5f,1.0f},{1.0f,0.5f,1.0f},{1.0f,0.5f,0.75f}
};

GLfloat zoom = -40.0f;                // 视角远近

typedef struct
{
     float x, y, z;                   // 粒子位置
} PARTICLE;

typedef struct
{
     PARTICLE particles[MAX_TAIL];
     float xspeed, yspeed, zspeed;    // 粒子速度
     float xg, yg, zg;                // 加速度
} TAIL;

struct
{
     TAIL tails[MAX_PARTICLES];
     float r, g, b;                   // 颜色
     GLfloat life;                    // 生命
     GLfloat fade;                    // 衰减速度
     GLfloat rad;                     // xz平面上的运动速度
     int style;                       // 上升还是下降
     int count;                       // 小烟花尾部点数
} Fire[MAX_FIRE];
Click to read more ...

Putty中文乱码问题

很简单的问题,解决N次忘N次,还是记下好。

  1. 如果$locale没有zh_CN,$export LC_ALL=zh_CN.utf8,前提$locale -a中有zh_CN.utf8

  2. 在window-〉Appearance-〉Translation中,Received data assumed to be in which character set 中,把Use font encoding改为UTF-8,用$date 命令测试.

  3. 如果还不行,选择window-〉Appearance-〉Font settings-〉Change…,选择Fixedsys字体,字符集选择CHINESE_GB2312。

再不行继续google了

解决putty上vim小键盘不好使的问题

http://syre.blogbus.com/logs/10431681.html

原来在putty上用vi的时候,开NumLock时按小键盘上的数字键并不能输入数字,而是出现一个字母然后换行(实际上是命令模式上对应上下左右的键)。输入数字的时候,不能用小键盘总是很不舒服的。于是就去找解决办法。

其实最后的解决办法也很简单,在选项Terminal- Features里,找到Disable application keypad mode,选上就可以了。

Click to read more ...

[zz]OpenCV设置摄像头的分辨率

原出处

OpenCV中原本是有设置视频捕捉属性的函数的,如下:

CVAPI(int)    cvSetCaptureProperty( CvCapture* capture, int property_id, double value );
//cvSetCaptureProperty(pCapture, CV_CAP_PROP_FPS, 30);
//cvSetCaptureProperty(pCapture, CV_CAP_PROP_FRAME_WIDTH, 1024);
//cvSetCaptureProperty(pCapture, CV_CAP_PROP_FRAME_HEIGHT, 768);

不过我用了之后没效果,就google到这篇文章了,也仅此一篇,实践过可行,源码也蛮清楚的,保存下。


Opencv是提供了一系列的摄像头设置函数的,但是没有提供相应的实现,使用的话,需要如下设置:

1 把下面几个定义添加到 highgui.h中

#define CV_CAP_PROP_DIALOG_DISPLAY 8
#define CV_CAP_PROP_DIALOG_FORMAT 9
#define CV_CAP_PROP_DIALOG_SOURCE 10
#define CV_CAP_PROP_DIALOG_COMPRESSION 11
#define CV_CAP_PROP_FRAME_WIDTH_HEIGHT 12

2 把页面中的函数

static int icvSetPropertyCAM_VFW( CvCaptureCAM_VFW* capture, int property_id, double value )

添加到cvcap_vfw.cpp中,放在typedef struct CvCaptureCAM_VFW 这个结构之后。(见下文)

3 用下面的函数代替cvcap_vfw.cpp中的同名函数

static CvCaptureVTable captureCAM_VFW_vtable =
{
    6,
    (CvCaptureCloseFunc)icvCloseCAM_VFW,
    (CvCaptureGrabFrameFunc)icvGrabFrameCAM_VFW,
    (CvCaptureRetrieveFrameFunc)icvRetrieveFrameCAM_VFW,
    (CvCaptureGetPropertyFunc)icvGetPropertyCAM_VFW,
    (CvCaptureSetPropertyFunc)icvSetPropertyCAM_VFW, // was NULL
    (CvCaptureGetDescriptionFunc)0
};

4 编译highgui

用的时候调用如下函数即可

cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH_HEIGHT, 640480 )

补充,需要的函数:

static int icvSetPropertyCAM_VFW( CvCaptureCAM_VFW* capture, int
    property_id, double value )
{
    int result = -1;
    CAPSTATUS capstat;
    CAPTUREPARMS capparam;
    BITMAPINFO btmp; 

    switch( property_id ) 
    {
    case CV_CAP_PROP_DIALOG_DISPLAY:
        result = capDlgVideoDisplay(capture->capWnd);
        //SendMessage(capture->capWnd,WM_CAP_DLG_VIDEODISPLAY,0,0);
        break;
    case CV_CAP_PROP_DIALOG_FORMAT:
        result = capDlgVideoFormat(capture->capWnd);
        //SendMessage(capture->capWnd,WM_CAP_DLG_VIDEOFORMAT,0,0);
        break;
    case CV_CAP_PROP_DIALOG_SOURCE:
        result = capDlgVideoSource(capture->capWnd);
        //SendMessage(capture->capWnd,WM_CAP_DLG_VIDEOSOURCE,0,0);
        break;
    case CV_CAP_PROP_DIALOG_COMPRESSION:
        result = capDlgVideoCompression(capture->capWnd);
        break;
    case CV_CAP_PROP_FRAME_WIDTH_HEIGHT:
        capGetVideoFormat(capture->capWnd,, sizeof(BITMAPINFO));
        btmp.bmiHeader.biWidth = floor(value/1000);
        btmp.bmiHeader.biHeight = value-floor(value/1000)*1000;
        btmp.bmiHeader.biSizeImage = btmp.bmiHeader.biHeight *
        btmp.bmiHeader.biWidth * btmp.bmiHeader.biPlanes *
        btmp.bmiHeader.biBitCount / 8;
        capSetVideoFormat(capture->capWnd,, sizeof(BITMAPINFO));
        break;
    default:
        break;
    } 

    return result;
}
Click to read more ...

关于MFC隐藏窗口的方法

作业的一个程序要用到隐藏窗口。虽然个人很想编程命令行下的。但是没办法。。找了找mfc隐藏窗口的代码。发现一篇好文章.

很多时候我们需要做一些后台的服务程序,这时我们就不需要弹出程序的窗口,因此便需要隐藏程序的窗口,以下就是一些我从网上或者其它途径获取的隐藏程序窗口的方法,一般的MFC应用程序有基于对话框的,单文档和多文档,而单文档和多文档的方法是一样的,所以这里只以单文档为例:

隐藏基于对话框的MFC应用程序窗口的方法

(推荐这个方法,非常好用)

很多人可能会将窗口创建出来,然后用一个 ShowWindow(SW_HIDE) 的方法去隐藏窗口,当然这是可以做到隐藏的功能,但是有一点不足的地方就是窗口在隐藏之前会有一下短瞬的闪烁,而以下这种方法可以解决这种问题:

在 C***App::InitInstance() 的函数中将以下的这一段注释掉:

C***Dlg dlg;
m_pMainWnd =&dlg;

int nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
    // TODO: Place code here to handle when the dialog is
    // dismissed with OK
}
else if (nResponse == IDCANCEL)
{
    // TODO: Place code here to handle when the dialog is
    // dismissed with Cancel
}

// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;

换成:

C***Dlg *dlg = new C***Dlg;
m_pMainWnd = dlg;

return dlg->Create(IDD_***_DIALOG);

同时将 IDD_***_DIALOG 的对话框资源的 More Stytles 属性页的 Visible 属性的勾去掉即可。这是我认为最简单的一种方法,还有另外一种方法,就是在工作区的资源菜单中插入一个新的对话框,然后用 ClassWizard 新建一个与之对应的类, 而下面

C***Dlg *dlg = new C***Dlg;
m_pMainWnd = dlg;

return dlg->Create(IDD_***_DIALOG);

这里的CDlg和IDD__DIALOG改为与你新建的对话框的对应即可,方法的原理与上面的一样,只是麻烦了一点点而已.

隐藏基于单文档的MFC应用程序窗口的方法

1) 最简单的方法是从网上的找到的,可行,好用

CMainFrame::ActiveFrame()    
{    
    nCmdShow=    SW_HIDE;    
    CFrameWnd::ActivateFrame(nCmdShow);    
}    
C??App::Initstance()    
{    
    m_pMainWnd->ShowWindow(SW_HIDE);    
    //UpdateWindow();    
}

因为 MFC 有两个步骤来显示 SDI 主窗口, 所有必须在这两个地方都 SW_HIDE, 否则就会闪动。即便 HWND 没有 WS_VISIBLE 属性, 用ShowWindow(SW_SHOW) 还是可以显示该 HWND 的, 所以vcbear的方法有问题。这里的ActiveFrame函数可以在ClassWizard中添加.

2)第二种方法则相对繁琐得多

第一步,将CMainFrame的构造函数改为public属性(默认是protected的)

第二步,将C***App::InitInstance()里面的下面代码注释掉:

CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(CTestHideDoc),
    RUNTIME_CLASS(CMainFrame),    // main SDI frame window
    RUNTIME_CLASS(CTestHideView));
AddDocTemplate(pDocTemplate);

// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);

// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
    return FALSE;

// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();

换成以下的代码:

m_pMainWnd = new CMainFrame();
BOOL bRet = ((CMainFrame *)m_pMainWnd)->LoadFrame(IDR_MAINFRAME);
if (bRet)
{
    m_pMainWnd->UpdateWindow();
}
else
{
    if (m_pMainWnd)
    {
    delete m_pMainWnd;
    m_pMainWnd = NULL;
    }
}

这样子编绎出来的程序运行时便不会有主窗口。

纵观上面的隐藏窗口的方法,除了使用ShowWIndow(SW_HIDE)的方法之外,其实都是将程序中m_pMainWnd指针换一下面目,原来是正常显示的,就改为不显示,或者用其它的对话框或者自身新建一个不同类别的框架指针.

我一开始的疑惑是既然CApp会有自已的线程和消息循环机制,那么为什么还必要要这么一个框架类CMainFrame作为它的支撑呢?后来查了一下源码发现在CApp类的Run()函数里面有这么一段(关于Run函数这里不做详细讲解,有兴趣可以去查看 深入浅出MFC ):

int CWinApp::Run()
{
    if (m_pMainWnd == NULL&&AfxOleGetUserCtrl())
    {
        // Not launched /Embedding or /Automation, but has no main window!
        TRACE0("Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.\n");
        AfxPostQuitMessage(0);
    }
    return CWinThread::Run();
}

呵呵,原来只要 m_pMainWnd 不为 NULL, 则主线程就可以转起来.至此,所有的问题就迎刃而解。

http://www.nf-blog.cn 原创

Click to read more ...

唯美主义 STL

原文: STL Easy Study

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;

void main(void)
{
    typedef vector<int> int_vector;
    typedef istream_iterator<int> istream_itr;
    typedef ostream_iterator<int> ostream_itr;
    typedef back_insert_iterator<int_vector> back_ins_itr;

    // STL中的vector容器
    int_vector num;

    // 从标准输入设备读入整数,
    // 直到输入的是非整型数据为止
    copy(istream_itr(cin), istream_itr(), back_ins_itr(num));

    // STL中的排序算法
    sort(num.begin(), num.end());

    // 将排序结果输出到标准输出设备
    copy(num.begin(), num.end(), ostream_itr(cout,"\n"));
}

在这个程序里几乎每行代码都是和STL有关的(除了main和那对花括号,当然还有注释),并且它包含了STL中几乎所有的各大部件(容器 container,迭代器iterator, 算法algorithm, 适配器adaptor),唯一的遗憾是少了函数对象(functor)的身影。

Click to read more ...

Poisson Image Editing

Poisson Image Editing. SIGGRAPH2003.

Patrick Perez, Michel Gangnet and Andrew Blake.

做了近一周多,时间都用在MFC、CxImage库和稀疏矩阵求解库的使用上了,Poisson算法倒是很明了,在Intel MKL库调试成功当天完成的。那个开源的TAUCS库怎么也放不到MFC中,最后只好用MKL了。这个算法的效果不是很好,Microsoft Research Asia和The Chinese University of Hong Kong的Drag-and-Drop Pasting策略效果改进很多了,主要优化了下边界和透明度处理,有时间一定也去实现下。

在生成Release版本时又遇到了问题,后来请教了牛人学长才得知,要生成Release版则库一般也要相应的是Release的。解释是,如果库的内存分配操作在内部实现,就一定也要Release的,而像OpenCV库的对象内存都是在库外分配的,所以Debug和Release可以用同一版本的lib。因为这个程序的运算量比较大,才发现Release比Debug明显快了很多!

//////////////////////////////////////////////////////////////////////////
// Poisson求解函数
// Input:
//   idata,iwidth,iheight,istep 源图像及其宽高和每行步长
//   pSel 选区,    offsetx,offsety 源图像在目标图像上的偏移量,选区大小与源图像相等
// odata,owidth,oheight,,ostep 目标图像及其宽高和每行步长
void CSolver::Solve(const BYTE *idata, int iwidth, int iheight, int istep,
                       const BYTE *pSel, const UINT offsetx, const UINT offsety,
                       BYTE *odata, int owidth, int oheight, int ostep)
Click to read more ...

关于TAUCS库的编译

http://www.tau.ac.il/%7Estoledo/taucs/

主要说下命令行下编译环境建立,只要在VC或VS2003/2005的安装目录下找vcvars32.bat ,如我的VS2005在D:\Program Files\Microsoft Visual Studio 8\VC\bin\vcvars32.bat,运行它即可。然后开始编译TAUCS库,在MS-DOS下,到taucs库存放configure.bat的目录,运行它,生成配置文件(makefile),再输入nmake命令就开始编译了。可以用“nmake nmake.txt ”把编译过程提示信息保存到nmake.txt文件。不过最终我还是没编译成功,就生成了个libtaucs.lib库文件,其它的都没成功生成,所以只好用Intel MKL了。

2010-06-25 补充

可能有用的方案

著名的CGAL(Computational Geometry Algorithms Libaray) 库的 Installation Manual 中提到 Taucs 项目对 vs 的支持不好,所以他们提供了一个预编译好的,有兴趣的可以去看看。 传送门

如果还不行,也可以试试用 mingw 来编译,编译好后也可以在 vs 中使用,ffmepg 的 Win32 二进制版本好像就这么得到的。

另一个数学库 Eigen

再推荐一个开源数学库 Eigen ,代码写得可以像 Matlab 一样精简,一点不夸张。我就用它和 Matlab 分别实现同一篇论文的算法,代码在数量和风格上几乎没变化(Matlab 代码都是尽可能用内置函数的噢~)。而且,该库在 Dense Matrix 的计算上与 mkl 可以相比,目前 Sparse Matrix 也支持,不过算法还在开发中。这是一个模版库,也就是说全部源代码都是头文件,不要编译。惊叹于开发人员的设计,大量使用 general programming 和 meta programming 技术,很难看懂。这些设计主要是为了提供易用 API 的同时,不牺牲效率,主要是对运算符的支持。小白本人以前就曾尝试过解决这个问题,无果。后来,查阅了 OpenCV2.0 的相关设计,了解到一些方案,不过当时没大关注。这次遇到这么大规模地应用,打算有空研究下!

Click to read more ...