directx用于图像处理_java 获取directx图像 - CSDN
  • 本系列文章将使用GPU实现图像处理中常用的算法,此处只给出代码,关于算法原理描述有很多资料,大家可以自行查找。不足之处请大家不吝赐教,共同提高。/******************************** * Author: rabbit729 * E...

      本系列文章将使用GPU实现图像处理中常用的算法,此处只给出代码,关于算法原理描述有很多资料,大家可以自行查找。不足之处请大家不吝赐教,共同提高。

    /********************************
    *  Author: rabbit729
    *  E-mail: wlq_729@163.com
    *  Date:   2012-09-20
    *  Description: 图像的二值化
    ********************************/
    #include <d3dx9.h>
    
    //-----------------------------------------------------------------------------
    // Desc: 全局变量
    //-----------------------------------------------------------------------------
    LPDIRECT3D9             g_pD3D                 = NULL;  //Direct3D对象
    LPDIRECT3DDEVICE9       g_pd3dDevice           = NULL;  //Direct3D设备对象
    
    LPDIRECT3DTEXTURE9      g_pTextureScreen        = NULL; //待处理图片
    
    ID3DXEffect*            g_pEffect               = NULL;  //效果指针
    //常量句柄
    D3DXHANDLE              hTechScreen             = NULL;  //Effect句柄
    D3DXHANDLE              hTexScreen              = NULL;  //纹理句柄
    D3DXHANDLE              hViewPortWidthInv       = NULL;  //视口宽倒数句柄
    D3DXHANDLE              hViewPortHeightInv      = NULL;  //视口高倒数句柄
    
    LPDIRECT3DVERTEXBUFFER9 g_pScreenSpaceQuad      = NULL;  //背板VB
    
    const int WIDTH  = 465;
    const int HEIGHT = 669;
    
    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_TEX1)
    
    struct Vertex
    {
    	Vertex(){}
    	Vertex(float x, float y, float z, float w)
    	{
    		_x = x;   _y = y;   _z = z; _w = w;
    	}
    
    	float _x, _y, _z, _w;
    
    	static const DWORD FVF;
    };
    const DWORD Vertex::FVF = D3DFVF_XYZW;
    
    
    //-----------------------------------------------------------------------------
    // Desc: 设置世界矩阵
    //-----------------------------------------------------------------------------
    VOID SetWorldMatrix()
    {
    	//创建并设置世界矩阵
    	D3DXMATRIXA16 matWorld, matRotateX, matRotateY;
    	D3DXMATRIXA16 matScale;
    	D3DXMatrixIdentity(&matScale);
    	matScale._11 = matScale._22 = matScale._33 = 0.5f;
    
    	D3DXMatrixIdentity(&matWorld);
    	D3DXMatrixIdentity(&matRotateX);
    	D3DXMatrixIdentity(&matRotateY);
    	D3DXMatrixRotationX( &matRotateX, D3DX_PI / 3.0 );
    	D3DXMatrixRotationY( &matRotateY, -D3DX_PI / 8.0 );
    	D3DXMatrixMultiply(&matWorld, &matRotateX, &matRotateY);
    
    	D3DXMatrixMultiply(&matWorld, &matScale, &matWorld);
    	g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
    }
    
    
    //-----------------------------------------------------------------------------
    // Desc: 设置观察矩阵和投影矩阵
    //-----------------------------------------------------------------------------
    VOID SetViewAndProjMatrix()
    {
    	//创建并设置观察矩阵
    	D3DXVECTOR3 vEyePt( 0.0f, 0.0f,-250.0f );
    	D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
    	D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
    	D3DXMATRIXA16 matView;
    	D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
    	g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
    
    	//创建并设置投影矩阵
    	D3DXMATRIXA16 matProj;
    	D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 1000.0f );
    	g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
    }
    
    
    //-----------------------------------------------------------------------------
    // Desc: 初始化Direct3D
    //-----------------------------------------------------------------------------
    HRESULT InitD3D( HWND hWnd )
    {
    	//创建Direct3D对象, 该对象用于创建Direct3D设备对象
    	if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
    		return E_FAIL;
    
    	//设置D3DPRESENT_PARAMETERS结构, 准备创建Direct3D设备对象
    	D3DPRESENT_PARAMETERS d3dpp; 
    	ZeroMemory( &d3dpp, sizeof(d3dpp) );
    	d3dpp.Windowed = TRUE;
    	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    	d3dpp.BackBufferFormat = D3DFMT_A8R8G8B8;
    
    	//创建Direct3D设备对象
    	if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
    		D3DCREATE_SOFTWARE_VERTEXPROCESSING,
    		&d3dpp, &g_pd3dDevice ) ) )
    	{
    		return E_FAIL;
    	}
    
    	//创建Effect
    	ID3DXBuffer* errBuffer = NULL;
    	if (FAILED(D3DXCreateEffectFromFile(g_pd3dDevice, L"erzhihua.fx", NULL, NULL, D3DXSHADER_DEBUG | D3DXSHADER_SKIPOPTIMIZATION, NULL, &g_pEffect, &errBuffer)))
    	{
    		if (errBuffer)
    		{
    			MessageBox(0, (LPCTSTR)errBuffer->GetBufferPointer(), 0, 0);
    			errBuffer->Release();
    		}
    		return E_FAIL;
    	}
    
    	//获取常量句柄
    	hTechScreen         = g_pEffect->GetTechniqueByName("Screen");
    	hTexScreen          = g_pEffect->GetParameterByName(0, "TexScreen");
    	hViewPortWidthInv   = g_pEffect->GetParameterByName(0, "viewport_inv_width");
    	hViewPortHeightInv  = g_pEffect->GetParameterByName(0, "viewport_inv_height");
    
    	//设置环境光
    	g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );
    
    	//设置观察矩阵和投影矩阵
    	SetViewAndProjMatrix();
    
    	return S_OK;
    }
    
    //-----------------------------------------------------------------------------
    // Desc: 创建场景图形
    //-----------------------------------------------------------------------------
    HRESULT InitGeometry()
    {
    	// 创建屏幕板
    	g_pd3dDevice->CreateVertexBuffer(
    		6 * sizeof(Vertex),
    		D3DUSAGE_WRITEONLY,
    		Vertex::FVF, 
    		D3DPOOL_MANAGED,
    		&g_pScreenSpaceQuad,
    		0);
    
    	Vertex* vertices;
    	g_pScreenSpaceQuad->Lock(0, 0, (void**)&vertices, 0);
    
    	vertices[0] = Vertex(-1.0f, 1.0f, 0.5f, 1.0f);
    	vertices[1] = Vertex(1.0f,  1.0f, 0.5f, 1.0f);
    	vertices[2] = Vertex( 1.0f, -1.0f, 0.5f, 1.0f);
    	vertices[3] = Vertex(-1.0f, 1.0f, 0.5f, 1.0f);
    	vertices[4] = Vertex( 1.0f, -1.0f, 0.5f, 1.0f);
    	vertices[5] = Vertex( -1.0f, -1.0f, 0.5f, 1.0f);
    
    	g_pScreenSpaceQuad->Unlock();
    
    	//加载纹理
    	HRESULT hr = D3DXCreateTextureFromFile(g_pd3dDevice, L"meinv.jpg", &g_pTextureScreen);
    	if (FAILED(hr))
    	{
    		return E_FAIL;
    	} 
    
    	return S_OK;
    }
    
    
    //-----------------------------------------------------------------------------
    // Desc: 释放创建的对象
    //-----------------------------------------------------------------------------
    VOID Cleanup()
    {
    	if (g_pScreenSpaceQuad != NULL)
    	{
    		g_pScreenSpaceQuad->Release();
    	}
    
    	if (g_pTextureScreen != NULL)
    	{
    		g_pTextureScreen->Release();
    	}
    
    	if (g_pEffect != NULL)
    	{
    		g_pEffect->Release();
    	}
    
    	//释放Direct3D设备对象
    	if( g_pd3dDevice != NULL )
    		g_pd3dDevice->Release();
    
    	//释放Direct3D对象
    	if( g_pD3D != NULL )
    		g_pD3D->Release();
    }
    
    VOID RenderScreen()
    {
    	//将RenderTarget作为纹理
    	g_pEffect->SetTexture(hTexScreen, g_pTextureScreen);
    
    	float fWidthInv = 1.0f / WIDTH;
    	float fHeightInv = 1.0f / HEIGHT;
    	g_pEffect->SetFloat(hViewPortWidthInv, fWidthInv);
    	g_pEffect->SetFloat(hViewPortHeightInv, fHeightInv);
    
    	g_pd3dDevice->SetStreamSource(0, g_pScreenSpaceQuad, 0, sizeof(Vertex));
    	g_pd3dDevice->SetFVF(Vertex::FVF);
    
    	// 设置要使用的Technique
    	g_pEffect->SetTechnique(hTechScreen);
    
    	UINT numPasses = 0;
    	g_pEffect->Begin(&numPasses, 0);
    
    	for (int i = 0; i < numPasses; i++)
    	{
    		g_pEffect->BeginPass(i);
    
    		g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
    
    		g_pEffect->EndPass();
    	}
    	g_pEffect->End();
    }
    
    //-----------------------------------------------------------------------------
    // Desc: 渲染场景
    //-----------------------------------------------------------------------------
    VOID Render()
    {    
    	// 获取backbuffer
    	LPDIRECT3DSURFACE9 pBackbuffer;
    	g_pd3dDevice->GetRenderTarget(0, &pBackbuffer);
    
    	//开始渲染场景
    	if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    	{
    		//设回backbuffer
    		g_pd3dDevice->SetRenderTarget(0, pBackbuffer);
    		RenderScreen();
    
    		//场景渲染结束
    		g_pd3dDevice->EndScene();
    	}
    
    	//在屏幕上显示场景
    	g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
    }
    
    
    //-----------------------------------------------------------------------------
    // Desc: 窗口过程, 处理消息
    //-----------------------------------------------------------------------------
    LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
    {
    	switch( msg )
    	{
    	case WM_DESTROY:
    		Cleanup();
    		PostQuitMessage( 0 );
    		return 0;
    	}
    
    	return DefWindowProc( hWnd, msg, wParam, lParam );
    }
    
    
    //-----------------------------------------------------------------------------
    // Desc: 入口函数
    //-----------------------------------------------------------------------------
    INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
    {
    	//注册窗口类
    	WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, 
    		GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
    		L"ClassName", NULL };
    	RegisterClassEx( &wc );
    
    	//创建窗口
    	HWND hWnd = CreateWindow( L"ClassName", L"图像二值化", 
    		WS_OVERLAPPEDWINDOW, 200, 100, WIDTH, HEIGHT,
    		GetDesktopWindow(), NULL, wc.hInstance, NULL );
    
    	//初始化Direct3D
    	if( SUCCEEDED( InitD3D( hWnd ) ) )
    	{ 
    		//创建场景图形
    		if( SUCCEEDED( InitGeometry() ) )
    		{
    			//显示窗口
    			ShowWindow( hWnd, SW_SHOWDEFAULT );
    			UpdateWindow( hWnd );
    
    			//进入消息循环
    			MSG msg; 
    			ZeroMemory( &msg, sizeof(msg) );
    			while( msg.message!=WM_QUIT )
    			{
    				if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
    				{
    					TranslateMessage( &msg );
    					DispatchMessage( &msg );
    				}
    				else
    				{
    					Render();  //渲染场景
    				}
    			}
    		}
    	}
    
    	UnregisterClass( L"ClassName", wc.hInstance );
    	return 0;
    }


    Effect代码如下:

    /********************************
    *  Author: rabbit729
    *  E-mail: wlq_729@163.com
    *  Date:   2011-09-20
    ********************************/
    
    //------------------------------
    //  顶点着色器
    //------------------------------
    
    float viewport_inv_width;
    float viewport_inv_height;
    struct VS_OUTPUTSCREEN {
       float4 Pos: POSITION;
       float2 texCoord: TEXCOORD0;
    };
    
    VS_OUTPUTSCREEN vs_mainPassScreen(float4 Pos: POSITION){
       VS_OUTPUTSCREEN Out;
    
       Out.Pos = float4(Pos.xy, 0, 1);
    
       Out.texCoord.x = 0.5 * (1 + Pos.x - viewport_inv_width);
       Out.texCoord.y = 0.5 * (1 - Pos.y - viewport_inv_height);
    
       return Out;
    }
    
    //------------------------------
    //  像素着色器
    //------------------------------
    Texture2D TexScreen;
    
    sampler2D TexMapScreen {
        Texture = <TexScreen>;
    };
    
    float4 ps_mainPassScreen(float2 texCoord: TEXCOORD0) : COLOR 
    {
       float4 col = tex2D(TexMapScreen,  texCoord);
       float Intensity;
    
       // 灰度化
       // I = 0.299*R + 0.587*G + 0.184*B
       Intensity = 0.299*col.r + 0.587*col.g + 0.184*col.r;
       
       // 阈值为0.5,关于怎么选取阈值有好多方法,大家可以自行查阅
       if(Intensity > 0.5)
          Intensity = 0.5f;
       else
          Intensity = 0.1f;
    
       return float4(Intensity.xxx,col.a);
    }
    
    technique Screen
    {
       pass P0
       {
          VertexShader = compile vs_3_0 vs_mainPassScreen();
          PixelShader  = compile ps_3_0 ps_mainPassScreen();
       }
    }


     结果:

    原始图片:

    二值化后结果:

    展开全文
  • DirectX图形处理(4)

    2007-01-29 17:59:00
    DirectX对象提供的服务可用于在场景上进行绘制6杂谝桓?/SPAN>Direct3D应用程序,初始化过程就是创建和配置DirectDraw、绘制表面、一个绘制设备和一个视口的过程。为了清楚起见,Triangle例子程序将系统对象初始化...

    初始化系统对象
       在创建了应用程序窗口之后,即可以开始初始化主DirectX对象。主DirectX对象提供的服务可用于在场景上进行绘制6杂谝桓?/SPAN>Direct3D应用程序,初始化过程就是创建和配置DirectDraw、绘制表面、一个绘制设备和一个视口的过程。为了清楚起见,Triangle例子程序将系统对象初始化代码从初始化场景的代码中分离出来。结果几何图形、特定于应用程序的数据结构和像材料这样次要的Direct3D对象与场景一起初始化,其实并不要求这样做,但这样会使代码更简单。

       Triangle例子程序在应用程序定义的Initialize3DEnvironment函数中执行系统初始化,在创建窗口之后从WinMain中调用。Initialize3DEnvironment函数所采用的步骤显示在下列子步骤中。

       注意: Triangle例子程序代码通过在WinMain函数中调用初始化方法来执行初始化过程,而且是在创建应用程序窗口之后立即进行的,并不是在响应诸如WM_CREATE等系统创建消息时进行的。这样就避免了对系统消息顺序的依赖,因为顺序在不同的平台上可能不一样。

    (1)初始化DirectDraw

       在创建了应用程序窗口之后,需要创建的第一个对象是DirectDraw对象,在设置应用程序的协同等级、创建显示表面和用做绘制设备的绘制目标时需要该对象。

       Triangle例子程序通过创建一个DirectDraw对象并设置应用程序的协同等级来开始执行初始化,如下列代码所示:

    HRESULT Initialize3DEnvironment( HWND hWnd )

    {

        HRESULT hr;

     

        hr = DirectDrawCreateEx( NULL, (VOID**)&g_pDD, IID_IDirectDraw7, NULL );

        if( FAILED( hr ) )

            return hr;

       上面的代码通过调用DirectDraw的全局函数DirectDrawCreateEx创建了一个DirectDraw对象。通过在第一个参数中传递NULL来请求函数为活动显示驱动程序创建一个DirectDraw对象。对于不支持GDI的硬件,例如仅有3-D功能的硬件,应当在第一个参数中显式指定所需要的驱动程序的全局惟一标识符(GUID)。这些GUID一般通过列举来获取。第二个参数是一个由DirectDrawCreateEx用DirectDraw对象的IDirectDraw7接口的地址来填充的全局变量的地址。将最后一个参数设置为NULL,表明新对象不能用于COM聚合特色。

       例子程序接下来设置应用程序的协同等级,如下所示:

        hr = g_pDD->SetCooperativeLevel( hWnd, DDSCL_NORMAL );

        if( FAILED( hr ) )

            return hr;

       例子程序通过调用IDirectDraw7::SetCooperativeLevel方法来设置协同等级。设置协同等级可有效地通知系统应用程序是在全屏模式下还是在窗口中进行绘制。

       注意:一些硬件不能在窗口中进行绘制。在调用IDirectDraw7::GetCaps时检查是否缺乏DDCAPS2_CANRENDERWINDOWED能力标志可以检查这样的硬件。

       代码通过在传递给SetCooperativeLevel的第二个参数中包括DDSCL_NORMAL来请求窗口化协作等级,也叫做“正常”协作等级。如果另一个应用程序已经控制了自身的全屏独占模式,则SetCooperativeLevel方法可能失败。

       注意:DDSCL_FPUSETUP协作等级标志可以提高性能。

    (2)设置DirectDraw表面

       在创建了DirectDraw对象并设置了协同等级之后,就可以创建应用程序用来绘制和显示场景的表面了。具体怎样创建表面,在很大程度上取决于应用程序是在窗口中运行还是在全屏模式下运行。

       注意:在全屏模式下运行的应用程序可以按照前面的代码示例中的方法来创建表面。一般情况下,应用程序应当利用页面翻转,这是一种在全屏独占模式下才能使用的特色。在这种情况下,代替显式创建两个表面,可以在一次调用中创建一个表面翻转链。

       Triangle例子程序运行于窗口之中,通过创建一个主表面开始,该主表面代表了显示,如下所示:

        DDSURFACEDESC2 ddsd;

        ZeroMemory( &ddsd, sizeof(DDSURFACEDESC2) );

        ddsd.dwSize = sizeof(DDSURFACEDESC2);

        ddsd.dwFlags = DDSD_CAPS;

        ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

     

        // 创建主表面

        hr = g_pDD->CreateSurface( &ddsd, &g_pddsPrimary, NULL );

        if( FAILED( hr ) )

            return hr;

       主表面的描述不包括尺寸或像素格式信息,因为已假定这些特性与显示模式相同。如果当前显示模式是800×600,16位彩色,则DirectDraw保证主表面与之相匹配。在创建了主表面之后,就可以创建绘制目标表面。在Triangle的情况下,绘制目标表面是一个分离的离屏表面,其创建过程如下所示:

        ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;

        ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | DDSCAPS_3DDEVICE;

     

        // 设置后台缓冲区的尺寸。如果窗口改变尺寸,需要销毁该表面并创建一个新

        // 表面

        GetClientRect( hWnd, &g_rcScreenRect );

        GetClientRect( hWnd, &g_rcViewportRect );

        ClientToScreen( hWnd, (POINT*)&g_rcScreenRect.left );

        ClientToScreen( hWnd, (POINT*)&g_rcScreenRect.right );

        ddsd.dwWidth  = g_rcScreenRect.right - g_rcScreenRect.left;

        ddsd.dwHeight = g_rcScreenRect.bottom - g_rcScreenRect.top;

     

        // 创建后台缓冲区。最可能的失败原因是用尽了视频内存(更复杂的应用程序应

        // 当处理这种情况)

        hr = g_pDD->CreateSurface( &ddsd, &g_pddsBackBuffer, NULL );

        if( FAILED( hr ) )

            return hr;

       上面的代码创建了一个与程序窗口尺寸相同的离屏表面。不需要创建一个更大的表面,因为窗口的尺寸规定了什么地方对用户是可见的(代码也初始化了两个后面用于设置视口和跟踪应用程序窗口尺寸和位置的全局变量)。正如上面的代码片段所示,必须为每一个将用做绘制目标的表面包括DDSCAPS_3DDEVICE能力。这个能力导致系统分配附加的仅用于3-D绘制的内部数据结构。在创建主表面时,当没有在表面描述中提供离屏表面的像素格式时假定离屏表面的像素格式与显示模式的像素格式一样。

       注意:要使用深度缓冲区的应用程序应当创建一个深度缓冲区并马上将其联系到绘制目标表面。为了简单起见,本示例没有使用深度缓冲区。

       在创建了主表面和绘制目标表面后,可以创建并联系一个DirectDrawClipper对象到显示表面。使用剪裁器可以避免在窗口的局部被其他窗口所覆盖或窗口的一部分位于显示区域之外时需要进行的处理。运行在全屏模式下的应用程序不需要剪裁器。Triangle例子程序用下列代码来创建一个剪裁器,并将其与显示窗口相联系:

        LPDIRECTDRAWCLIPPER pcClipper;

        hr = g_pDD->CreateClipper( 0, &pcClipper, NULL );

        if( FAILED( hr ) )

            return hr;

     

        // 将其指派给窗口句柄,然后将剪裁器设置到需要的表面

        pcClipper->SetHWnd( 0, hWnd );

        g_pddsPrimary->SetClipper( pcClipper );

        pcClipper->Release();

    (3)初始化Direct3D

       在创建了表面之后,应用程序必须绘制并显示场景。通过为DirectDraw对象获取一个指向IDirect3D7接口的指针,可以开始初始化Direct3D对象。该指针用于创建绘制场景所需要的所有对象。该接口是由DirectDraw对象暴露的,代表一个分离的特色集合,而不是分离的对象。通过调用DirectDraw 对象的IUnknown::QueryInterface方法来获取IDirect3D7接口。下列来自Triangle的代码用于执行这一任务:

        // 查询DirectDraw以便访问Direct3D

        g_pDD->QueryInterface( IID_IDirect3D7, (VOID**)&g_pD3D );

        if( FAILED( hr) )

            return hr;
     

    展开全文
  • 也就是说,它实际提供的是各种图像处理算法。若需具体应用,需要组合其算法以实现某个功能。 OpenCV 的全称 Open Source Computer Vision Library,是一个基于BSD许可(开源)发行的跨平台计算机视觉库,又名 “开源...

          1.OpenCV,主要以算法形式,展示其实现;也就是说,它实际提供的是各种图像处理算法。若需具体应用,需要组合其算法以实现某个功能。

                                              

    OpenCV 的全称 Open Source Computer Vision Library,是一个基于BSD许可(开源)发行的跨平台计算机视觉库,又名 “开源计算机视觉库”。OpenCV 是一个开源发行的跨平台计算机视觉库,可运行在 Windows、Android、Maemo、FreeBSD、OpenBSD、iOS、Linux 和 Mac OS 等平台。使用者可在 SourceForge 获得官方版本, 或从 SVN 获得开发版本。OpenCV 也用 CMake。

    在 Windows 上编译 OpenCV 中与摄像输入有关部分时,需要 DirectShow SDK 中的一些基类。该 SDK 可从预先编译的 Microsoft Platform SDK (or DirectX SDK 8.0 to 9.0c / DirectX Media SDK prior to 6.0) 的子目录 Samples\Multimedia\DirectShow\BaseClasses 获得。

    OpenCV 轻量且高效 —— 由一系列 C 函数和少量 C++ 类构成,同时提供了 Python、Ruby、MATLAB 等语言接口,实现了图像处理和计算机视觉方面的很多通用算法。

    OpenCV 用 C++ 语言编写,它的主要接口也是 C++ 语言,但依然保留了大量的 C 语言接口。OpenCV 库也有 Python、Java、MATLAB/OCTAVE (版本 2.5) 接口。这些语言的 API 接口函数,可通过在线文档获得。如今,OpenCV 也提供对于 C#、Ch、Ruby 的支持。

    OpenCV 所有新开发和算法都采用 C++ 接口。

    OpenCV 拥有包括 500 多个 C 函数的跨平台中、高层 API。OpenCV 不依赖于其它的外部库 —— 尽管也可使用某些外部库。

    1999 年 Intel 开始建立 OpenCV,如今由 Willow Garage 提供支持。

    OpenCV 为 Intel ® Integrated Performance Primitives (IPP) 提供了透明接口。这意味着,如果有为特定处理器优化的 IPP 库, OpenCV 将在运行时自动加载这些库。OpenCV 2.0 版代码已显著优化,无需 IPP 来提升性能,故 2.0 版不再提供 IPP 接口。

    2010 年 9 月实现 CUDA 的 GPU 接口。

    2015 年 6 月 4 日发布 OpenCV 3.0。

    2016年12月,发布OpenCV 3.2版(合并969个修补程序,关闭478个问题)。

    2017年8月3日,发布OpenCV 3.3版(最重要的更新是把DNN模块从contrib里面提到主仓库)。

    2017年12月23日发布,最新版本是3.4 。

           2.imageMagic主要以应用形式,展示其实现,;譬如:图像切割、图像融合、图像模糊、图像锐化等。

                                               

    ImageMagick 是一个免费开源、用于编辑、创建、合成图像的工具。ImageMagick 可读取、转换、写入多种格式图像。包括:图像切割、颜色替换、各种效果的应用,图像旋转、组合、文本、直线、多边形、椭圆、曲线、附加到图像伸展旋转、等等。

    ImageMagick 遵守 GPL 许可协议,是一个免费工具:完全开放源码,可自由使用、复制、修改、发布;它可运行于大多数操作系统。ImageMagick 几乎可在任何非专有操作系统上编译,无论是 32 位还是 64 位 CPU,包括:Linux、Windows 95/98/ME/NT 4.0/2000/XP、Windows 2003、Windows 7、Windows 8、Macintosh (MacOS 9 /10)、VMS 和 OS/2。ImageMagick 的大多数功能的用法都是使用命令行。

    ImageMagick 是一套功能强大、稳定且开源的工具集、开发包。可用来读、写和处理超过 200 多种格式的图片文件,包括流行的 TIF、JPG、JPEG、GIF、 PNG、PDF 以及 PhotoCD 等格式。

    ImageMagick 可根据 Web 应用程序的需要动态生成图片, 可对一个(或一组)图片进行缩放、旋转、锐化、减色或增加特效等操作,并将操作结果以相同格式或其它格式保存;对图片的操作,即可通过命令行进行,也可通过 C/C++、Perl、Java、PHP、Python 或 Ruby 编程完成。同时 ImageMagick 还提供了一个高质量的 2D 工具包,部分支持 SVG。ImageMagick 的主要精力集中在性能,减少 Bug 以及提供稳定的 API 和 ABI 上。

                                     

           3.GraphicsMagick号称图像处理领域的瑞士军刀。其短小精悍的代码却提供了一个鲁棒、高效的工具和库集合,来处理图像的读取、写入和操作。

                                                

    GraphicsMagick 号称图像处理领域的瑞士军刀。GraphicsMagick 短小精悍的代码,却提供了一个鲁棒、高效的工具和库集合,来处理图像的读取、写入和操作。

    GraphicsMagick 支持大图片的处理,且做过 GB 级的图像处理实验。GraphicsMagick 能动态生成图片,特别适于互联网应用。

    GaphicsMagick 不仅支持命令行模式,同时也支持 C、C++、Perl、PHP、Tcl、 Ruby、Lua、Python、Windows .NET、Windows COM 编程接口等的调用。事实上,GraphicsMagick 是从 ImageMagick 5.5.2 分支出来的,现在它已变得更稳定和更优秀,相比之下。

    GraphicsMagick 可用来处理调整图片尺寸、旋转、加亮、颜色调整、增加特效等。GraphicsMagick 支持超过 88 种图像格式,包括重要的 DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM 和 TIFF。通过使用 OpenMP 可利用多线程进行图片处理,增强了通过扩展 CPU 提高处理能力。

    GraphicsMagick 可在绝大多数平台上使用,包括 Linux、Mac OS、Windows (2000、XP、Vista、7、8.X、10) 操作系统。

    三种库的优势对比:

    OpenCV 比较 ImageMagick:

    (1).OpenCV 和 ImageMagick 代码都开源,方便开发;

    (2).ImageMagick 最近更新不多,OpenCV 近几年有 Intel 的支持更新比较及时,功能越来越强大,bug 修复也比较及时;

    (3).ImageMagick 使用简便;OpenCV 的使用稍微复杂,对使用者有一定的图像技术要求;

    (4).ImageMagick 封装较好,使用灵活度稍低;OpenCV 使用比较灵活;

    (5).ImageMagick 功能实现较少,主要是一些常用的图像处理,很多比较复杂的图像处理并没有实现。OpenCV 的算法实现非常强大,且从其最近版本更新的速度来看,它更加强大,很多经典的图像处理算法都有实现。作为一个图像开发者,这是一个很大的诱惑。

    (6).ImageMagick 函数运行较慢, OpenCV 运行速度较快。常见函数 ,包括:图像读、图像压缩、图像写等 ,OpenCV 都要比 ImageMagick 快很多。

    (7).OpenCV 不能解析 gif 文件格式,版权原因,试图载入 gif 文件会出错。若要用 OpenCV 功能,又需解析 gif 文件格式,可先用其他函数库将其读入再转化为 IplImage。ImageMagick 支持处理 gif 文件格式。

    (8).ImageMagick 有一个不错的 sharpen 函数,用于锐化图像,效果挺不错。OpenCV 中没有锐化函数,没有相应的锐化算法实现。若确想使用这个函数,可在 OpenCV 下实现 ImageMagick 相应源代码。

    OpenCV 功能强大,代码运行速度快,更新速度也快,但对开发者有一定的要求。ImageMagick 使用比较简单,对图像处理不太熟悉,又只想实现简单图像处理时,可选择。

    若选择使用 ImageMagick,建议使用 GraphicsMagick。GraphicsMagick 和 ImageMagick 的函数调用方法相同,但 GraphicsMagick 在效率上优于 ImageMagick,特别是在 windows 下运行。

    GraphicsMagick 比较 ImageMagick:

    (1).GraphicsMagick 更有效率,能更快的完成处理工作;

    (2).GraphicsMagick 更小更容易安装;

    (3).GraphicsMagick 已被 Flickr (雅虎旗下图片分享网站) 和 Etsy (网络商店平台) 使用,每天处理百万计的图片;

    (4).GraphicsMagick 和已安装软件不会发生冲突;

    (5).GraphicsMagick 几乎没有安全问题;

    (6).GraphicsMagick 的手册非常丰富;





    展开全文
  • Java OpenCV-4.0.0 图像处理00 OpenCV介绍 OpenCV简介: OpenCV的全称是Open Source Computer Vision Library,是一...OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。该程序库也可以使用英特尔公司...

    Java OpenCV-4.0.0 图像处理00 OpenCV 介绍

    OpenCV简介

    OpenCV的全称是Open Source Computer Vision Library,是一个跨平台的计算机视觉库。OpenCV是由英特尔公司发起并参与开发,以BSD许可证授权发行,可以在商业和研究领域中免费使用。OpenCV可用于开发实时的图像处理、计算机视觉以及模式识别程序。该程序库也可以使用英特尔公司的IPP进行加速处理。

    OpenCV可用于解决如下领域的问题:

    增强现实
    人脸识别
    手势识别
    人机交互
    动作识别
    运动跟踪
    物体识别
    图像分割
    机器人

    历史编辑

    OpenCV原作者英特尔公司初始版本2000年6月稳定版本。

    OpenCV项目最早由英特尔公司于1999年启动,致力于CPU密集型的任务,是一个包括如光线追踪和3D显示的计划的一部分。早期OpenCV的主要目标是为推进机器视觉的研究,提供一套开源且优化的基础库。不重造轮子。提供一个共同的基础库,使得开发人员的代码更容易阅读和转让,促进了知识的传播。通过提供一个不需要开源或免费的软件许可,促进商业应用软件的开发。

    OpenCV现在也集成了对CUDA的支持.

    OpenCV的第一个预览版本于2000年在IEEE Conference on Computer Vision and Pattern Recognition公开,并且后续提供了五个测试版本。1.0版本于2006年发布。

    OpenCV的第二个主要版本是2009年10月的OpenCV 2.0。该版本的主要更新包括C++接口,更容易、更类型安全的模式,新的函数,以及对现有实现的优化(特别是多核心方面)。现在每6个月就会有一个官方版本[1],并由一个商业公司赞助的独立小组进行开发。

    在2012年8月,OpenCV的支持由一个非盈利性组织(OpenCV.org)来提供,并保留了一个开发者网站[2]和用户网站。

    编程语言编辑

    OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python, Java and MATLAB/OCTAVE (版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。[4]现在也提供对于C#, Ch,[5] Ruby的支持。

    所有新的开发和算法都是用C++接口。一个使用CUDA的GPU接口也于2010年9月开始实现.

    操作系统支持编辑

    OpenCV可以在Windows, Android,[7] Maemo,[8]FreeBSD, OpenBSD, iOS,[9] Linux和Mac OS等平台上运行。用户可以在SourceForge获得官方版本,或者从SVN获得开发版本。OpenCV也是用CMake.

    Windows 操作系统要求编辑

    在Windows上编译OpenCV中与摄像输入有关部分时,需要DirectShow SDK中的一些基类。该SDK可以从预先编译的Microsoft Platform SDK (or DirectX SDK 8.0 to 9.0c / DirectX Media SDK prior to 6.0)的子目录Samples\Multimedia\DirectShow\BaseClasses获得。

    参考文献编辑

    OpenCV change logs: 存档副本.[2012-11-20]. (原始内容存档于2012-11-21).

    OpenCV Developer Site: http://code.opencv.org Wikiwix的存档,存档日期2013-04-15

    OpenCV User Site: http://opencv.org/

    OpenCV C interface: http://docs.opencv.org

    Ch OpenCV: http://www.softintegration.com/products/thirdparty/opencv/

    Cuda GPU port: http://opencv.org/platforms/cuda.html

    Android port: 存档副本. [2012-12-30]. (原始内容存档于2012-11-26).

    Maemo port: https://garage.maemo.org/projects/opencv

    iPhone port: http://www.eosgarden.com/en/opensource/opencv-ios/overview/

    展开全文
  • 一、为什么这么慢?二、DIB的结构三、DIB访问函数四、实战练习五、使用DIBSection和模拟指针六、结合DirectX 一、为什么这么慢?...特别是图像处理,被认为是VB的禁区。说起来也是,市面上的关于V
  • Python与图像处理8

    2017-05-23 16:43:11
    图像配准是指将不同时间、不同传感器(成像设备)或不同条件下(天候、照度、摄像位置和角度等)获取的两幅或多幅图像进行匹配、叠加的过程,它已经被广泛地应用于遥感数据分析、计算机视觉、图像处理等领域。...
  • 图像处理---深入ManagedDirectX9(5)(转)[@more@] 使用简单的渲染技术 至今为止,我们的渲染工作效率都很低。每次渲染场景时,都要分配新的顶点列表,并且所有东西存储在系统内存里。现代显卡集成了足够的显...
  • 第一章Windows位图和调色板 1.1位图和调色板的概念 1.真彩色图:它的颜色数高达256×256×256种,也就是说包含我们上述提到的R、G、B颜色表示方法中所有的颜色。真彩色图是说它具有显示所有颜色的能力,即最多...
  • ImageGear for .NET是一款图形图像处理控件,具有扫描,压缩,浏览、添加注释,打印,图像编辑,OCR以及PDF和矢量图像支持,使开发人员可以快速地开发出图像处理程序,可用于.NET Framework2.0、3.0、3.5、4.0,...
  • 本文由哈利_蜘蛛侠原创,转载请注明出处!...     从这一期起,我们进入了本书的第二部分,叫做DirectXBasics (DirectX...第2章 Drawing with DirectX Graphics (用DirectX图形进行绘图) 第3章 Interacting with Direct
  • 图像处理---深入ManagedDirectX9(1)(转)[@more@] Device类是DirectX里的所有绘图操作所必须的。可以把这个类假想为真实的图形卡。场景里所有其他图形对象都依赖于device。你的计算机里可以...
  • OpenCV,OpenGL,DirectX区别

    2012-12-19 17:44:27
    OpenCV,OpenGL,DirectX区别 哪位大神能比较详细的解释一下OpenCV,OpenGL,DirectX三者的区别?...OpenCV封装的许多算法可以完成普通的图像处理操作,例如去噪、识别等等,后面两个没接触过  ------解决方案----
  • 使用GDI+进行图像处理

    2011-10-18 13:48:55
    如何进行图像的旋转呢?其实这个问题的一种解决方法是利用二维(x,y坐标中)矩阵转换实现图像旋转。使用高中时所学的三角知识或者大学中的线性代数知识就可以解决。其原理是已知一个点的坐标,那么这个点的旋转坐标...
  • 图像处理---深入ManagedDirectX9(2)(转)[@more@] 三维化三角形 再来看看我们的程序,看起来并不是那么“三维”。而且我们所做的都能用GDI+轻易完成。So,我们应该怎样在3维空间里绘图,并且给人留下...
  • 第三章 DirectX SDK简介 第一节 关于DirectX SDK Microsoft DirectX提供了一套非常优秀的应用程序接口,包含了设计高性能、实时应用程序的源代码。DirectX技术将帮助您建构下一代的电脑游戏和多媒体应用程序。它的...
  • 在进行第一个VR应用开发之前,我们来看看几个重要的概念:  搭建场景:创建一个可视化、可交互、脚本驱动的虚拟现实环境。  立体渲染:用两个相机渲染场景分别表示用户的左右眼,然后通过Oculus Rift头显的...
  • 3D 图像处理

    2010-06-12 10:18:00
    3D 基本术语
  • OpenCV,OpenGL,DirectX

    2017-12-21 14:17:45
    OpenCV 是图像处理库,一般针对真实图像,比如摄像头、照相机获取的视频图像。 OpenGL,DirectX都是2D/3D图形软件接口,更多的用于计算机“虚拟”图像,比如游戏,虚拟现实啊,地形建模等等,侧重于图像的显示等等。
  • 具有扫描,压缩,浏览、添加注释,打印,图像编辑,OCR以及PDF和矢量图像支持,使开发人员可以快速地开发出图像处理程序,可用于.NET Framework2.0、3.0、3.5、4.0,ASP.NET,WPF,SilverLight,DirectX 10和Direct...
1 2 3 4 5 ... 20
收藏数 6,247
精华内容 2,498
关键字:

directx用于图像处理