新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → Visual C++实现视频图像处理技术 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 5028 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: Visual C++实现视频图像处理技术 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 Visual C++实现视频图像处理技术

    [前言:] 随着计算机软件、硬件技术的日新月异的发展和普及,人类已经进入一个高速发展的信息化时代,人类大概有80%的信息来自图像,科学研究、技术应用中图像处理技术越来越成为不可缺少的手段。图像处理所涉及的领域有军事应用、医学诊断、工业监控、物体的自动分检识别系统等等,这些系统无不需要计算机提供实时动态,效果逼真的图像。

      基于图像采集卡的视频图像处理系统

      计算机图像处理系统从系统层次上可分为高、中、低档三个层次,目前一般比较普及的是低档次的系统,该系统由CCD(摄像头)、图像采集卡、计算机三个部分组成,其结构简单,应用方便,效果也比较不错,得到的图像较清晰。目前网上基于VC开发经验的文章不少,可是关于如何在VC开发平台上使用图像采集卡的文章确没发现,笔者针对在科研开发中积累的使用图像采集卡经验,介绍如何自己是如何将采集卡集成到图像开发系统中,希望能够给目前正需要利用图像采集卡开发自己的图像处理系统的朋友有所帮助。

      笔者使用的摄像机采用台湾BENTECH INDUSTRIAL 有限公司生产的CV-155L黑白摄像机。该摄像机分辨率为752x582。图象采集卡我们采用北京中科院科技嘉公司开发的基于PCI 总线的CA-MPE 1000 黑白图象采集卡。使用图像采集卡分三步,首先安装采集卡的驱动程序,并将虚拟驱动文件VxD.vxd拷贝到Windows的SYSTEM目录下;这时候就可以进入开发状态了,进入VC开发平台,生成新的项目,由于生产厂家为图像采集卡提供了以mpew32.dll、mpew32.lib命名的库文件,库中提供了初始硬件、采集图像等函数,为使用这些函数,在新项目上连接该动态库;最后一步就是采集图像并显示处理了,这一步要设置系统调色板,因为采集卡提供的是裸图形式,既纯图像数据,没有图像的规格和调色板信息,这些需要开发者自己规定实现,下面是实现的部分代码:

    CTestView::CTestView()
    {

    W32_Init_MPE1000();//初始化采集卡
    W32_Modify_Contrast(50);//下面的函数是为了对采集卡进行预设置
    W32_Modify_Brightness(45);//设置亮度
    W32_Set_HP_Value(945);//设置水平采集点数
    wCurrent_Frame = 1;//当前帧为1,获取的图像就是从这帧取得的
    // 设置采集信号源,仅对MPE1000有效
    W32_Set_Input_Source(1);
    W32_CACardParam(AD_SETHPFREQ,hpGrabFreq);
    W32_Set_PAL_Range(1250, 1024);//设置水平采集范围
    W32_Set_VGA_Mode ( 1 );
    wGrabWinX1 = 0; // 采集窗口的左上角的坐标
    wGrabWinY1 = 0;
    firstTime=TRUE;
    bGrabMode = FRAME;
    bZipMode = ZIPPLE;

    /
    lpDib=NULL;//存放获取的图像数据

    }

    CTestView::~CTestView()
    {
    W32_Close_MPE1000();//关闭采集卡
    }
    ////显示采集的图象,双击鼠标采集停止
    void CTestView::OnGraboneframe()
    {
    // TODO: Add your command handler code here
    wCurrent_Frame = 1;
    // 设置采集目标为内存
    W32_CACardParam (AD_SETGRABDEST, CA_GRABMEM);
    // 启动采集
    if (lpDib != NULL)
    {
    GlobalUnlock( hglbDIB );
    GlobalFree( hglbDIB );
    }
    // 分配内存
    hglbDIB=GlobalAlloc(GHND, (DWORD)wImgWidth*(DWORD)wImgHeight );
    lpDib = (BYTE *)GlobalLock( hglbDIB );
    hdc = GetDC()->GetSafeHdc( ) ;
    if(lpDib != NULL)
    {
    cxDib = wImgWidth;
    cyDib = wImgHeight;
    SetLogicPal( hdc, cxDib, cyDib, 8 );

    SetStretchBltMode (hdc, COLORONCOLOR) ;

    bGrabMark = TRUE;

    while (bGrabMark == TRUE)
    {
    if(msg.message==WM_LBUTTONDBLCLK)
    bGrabMark = FALSE;

    W32_ReadXMS2Buf (wCurrent_Frame,lpDib) ;
    SetDIBitsToDevice (hdc, 0, 0, cxDib, cyDib, 0, 0,
    0, cyDib, (LPSTR) lpDib,
    bmi,
    DIB_RGB_COLORS) ;
    }
    // 停止采集
    W32_CAStopCapture();
    ::ReleaseDC( GetSafeHwnd(), hdc );
    return ;
    }
    ////将下面这个函数添加在视图类的CTestView::OnSize()函数中,就可以对系统的调色板进行设置。
    void WINAPI InitLogicPal( HDC hdc , short width, short height, WORD bitCount )
    {
    int j, i;
    short cxDib, cyDib;
    LOGPALETTE * pLogPal;


    j=256 ;

    if ((pLogPal=(LOGPALETTE *)malloc(sizeof(LOGPALETTE) + (j*sizeof(PALETTEENTRY)))) == NULL)
    return ;

    pLogPal->palVersion=0x300;
    pLogPal->palNumEntries=j;

    for (i=0;i
    pLogPal->palPalEntry[i].peRed = i ;
    pLogPal->palPalEntry[i].peGreen = i ;
    pLogPal->palPalEntry[i].peBlue = i ;
    pLogPal->palPalEntry[i].peFlags = 0;
    }


    hPal = ::CreatePalette(pLogPal);
    delete pLogPal;
    ::SelectPalette(hdc,hPal,0);
    ::RealizePalette(hdc);

    cxDib = width; cyDib = height;

    if ( (bmi = (BITMAPINFO *)malloc(sizeof(BITMAPINFOHEADER) + j*sizeof(RGBQUAD))) == NULL )
    return ;
    //bmi为全局变量,用于显示图像时用
    bmi->bmiHeader.biSize = 40;
    bmi->bmiHeader.biWidth = cxDib;
    bmi->bmiHeader.biHeight = cyDib;
    bmi->bmiHeader.biPlanes = 1 ;

    bmi->bmiHeader.biBitCount = bitCount ;

    bmi->bmiHeader.biCompression = 0 ;
    bmi->bmiHeader.biSizeImage = 0 ;
    bmi->bmiHeader.biXPelsPerMeter = 0;
    bmi->bmiHeader.biYPelsPerMeter = 0;
    bmi->bmiHeader.biClrUsed = 0;
    bmi->bmiHeader.biClrImportant = 0;

    for (i=0;i
    bmi->bmiColors[i].rgbBlue = i ;
    bmi->bmiColors[i].rgbGreen = i ;
    bmi->bmiColors[i].rgbRed = i ;
    bmi->bmiColors[i].rgbReserved = 0 ;
    }

    }


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/5/22 11:46:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客2
    发贴心情 
    视频"画中画"技术

      "画中画"这个概念类似与彩色电视机"画中画",就是在一幅大的图像内显示另外一幅内容不同的小的图像,小图像的尺寸大小一般地说为大图像尺寸的1/4或1/9,显示位置在大图像的右上角。这种技术不仅在电视技术中,在可视电话系统也可以发现这种技术的身影,它们都是依靠硬件来实现的,但是如何在VC开发平台上用编程语言来将该功能添加到自己开发的视频监控软件,为使用者提供更大的信息量呢?也许读者最容易想到的是首先显示大图像,然后再在一个固定位置画第二幅小图像,这种技术技术如果对于静止图像当然没有问题,但是对于视频流,由于每一秒钟需要画25幀,即25幅图像,这样一来计算机需要不停的画不停的擦除,会给用户以闪烁的感觉,如何解决这个问题呢?有的参考书上将大小图像分快显示,这种方法要将待显示的图像数据与显示位置的关系对应起来,容易出错不说,而且麻烦,且速度慢,为此,我对该方法进行了改进,得到了满意的效果。实现的代码如下:

    void pictureinpicture( )
    {
    ………………………..
    CBitmap bitmap,*oldmap;
    pData1=(BYTE*)new char[biWidth*biHeight *3];//biWidth和biHeight为视频采集卡获取//的图像尺寸。
    Read(pData1,bih.biWidth*bih.biHeight *3);//该函数从采集卡中获取数据
    CClientDC dc(this);
    m_pBMI1= new BITMAPINFO;//自定义的BMP文件信息结构,用于后面的图像显示
    m_pBMI1->bmiHeader.biBitCount=24;
    m_pBMI1->bmiHeader.biClrImportant=0;
    m_pBMI1->bmiHeader.biClrUsed=0;
    m_pBMI1->bmiHeader.biCompression=0;
    m_pBMI1->bmiHeader.biHeight=biHeight;
    m_pBMI1->bmiHeader.biPlanes=1;
    m_pBMI1->bmiHeader.biSize=40;
    m_pBMI1->bmiHeader.biSizeImage=WIDTHBYTES(biWidth*8)*biHeight*3;
    m_pBMI1->bmiHeader.biWidth=biWidth;
    m_pBMI1->bmiHeader.biXPelsPerMeter=0;
    m_pBMI1->bmiHeader.biYPelsPerMeter=0;
    ////////////////////////////////////////////////////////////////////////
    pData2=(BYTE*)new char[biWidth1*biHeight1 *3];//申请存放小图像的缓冲区
    Read(pData2,biWidth1*biHeight1 *3);////向该缓冲区读数据
    m_pBMI2= new BITMAPINFO;
    m_pBMI2->bmiHeader.biBitCount=24;
    m_pBMI2->bmiHeader.biClrImportant=0;
    m_pBMI2->bmiHeader.biClrUsed=0;
    m_pBMI2->bmiHeader.biCompression=0;
    m_pBMI2->bmiHeader.biHeight=biHeight1;
    m_pBMI2->bmiHeader.biPlanes=1;
    m_pBMI2->bmiHeader.biSize=40;
    m_pBMI2->bmiHeader.biSizeImage=WIDTHBYTES(biWidth1*8)*biHeight1*3;
    m_pBMI2->bmiHeader.biWidth=biWidth1;
    m_pBMI2->bmiHeader.biXPelsPerMeter=0;
    m_pBMI2->bmiHeader.biYPelsPerMeter=0;
    //下面实现画中画的显示

    CDC MemDc;
    MemDc.CreateCompatibleDC(&dc);
    bitmap.CreateCompatibleBitmap(&dc,biWidth,biHeight);
    oldmap=MemDc.SelectObject(&bitmap);
    ::StretchDIBits(MemDc.m_hDC,0,0,biWidth,biHeight,0,0,—biWidth,biHeight,pData1,m_pBMI1,DIB_RGB_COLORS,SRCCOPY);//首先将大图像画在内寸上下文中

    ::StretchDIBits(MemDc.m_hDC,20,20,biWidth1,biHeight1,_
    0,0,biWidth1,biHeight1,pData2,m_pBMI2,DIB_RGB_COLORS,SRCCOPY);//再将小图像画在内寸上下文中

    ::StretchBlt(dc.m_hDC,0,0,bih.biWidth,bih.biHeight,_
    MemDc.m_hDC,0,0,bih.biWidth,bih.biHeight,SRCCOPY);//将结果显示在屏幕上。

    MemDc.SelectObject(oldmap);
    delete pData1;
    delete m_pBMI1;
    delete pData2;
    delete m_pBMI2;

    }

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/5/22 11:47:00
     
     DMman 帅哥哟,离线,有人找我吗?魔羯座1984-1-11
      
      
      威望:1
      头衔:数据挖掘青年
      等级:研二(Pi-Calculus看得一头雾水)(版主)
      文章:803
      积分:5806
      门派:W3CHINA.ORG
      注册:2007/4/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给DMman发送一个短消息 把DMman加入好友 查看DMman的个人资料 搜索DMman在『 C/C++编程思想 』的所有贴子 点击这里发送电邮给DMman 访问DMman的主页 引用回复这个贴子 回复这个贴子 查看DMman的博客3
    发贴心情 
    佩服

    ----------------------------------------------
    数据挖掘青年 http://blogger.org.cn/blog/blog.asp?name=DMman
    纪录片之家 (很多纪录片下载)http://www.jlpzj.com/?fromuid=137653

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/5/22 18:52:00
     
     一分之千 帅哥哟,离线,有人找我吗?射手座1984-11-30
      
      
      威望:1
      等级:研一(随老板参加了WWW大会还和Tim Berners-Lee合了影^_^)
      文章:632
      积分:4379
      门派:XML.ORG.CN
      注册:2006/12/31

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给一分之千发送一个短消息 把一分之千加入好友 查看一分之千的个人资料 搜索一分之千在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看一分之千的博客4
    发贴心情 
    不错,多谢分享

    ----------------------------------------------
    越学越无知

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/5/24 14:02:00
     
     GoogleAdSense射手座1984-11-30
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/23 0:58:18

    本主题贴数4,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    79.102ms