上一讲中我们介绍了图像特效显示操作的实现
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
,如随
机显示效果、马赛克效果、拉幕显示效果等,由于篇幅的限制,
还有许多效果没有介绍;本期讲座将接着上一讲的
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
,继续
介绍一些图像特效显示效果。
另外,我们前面的学习都是针对现成的BMP图像,在实
际工作学习中,绝大部分处理图像过程都是在一个系统环境
中,也就是说需要和图像数据的获取设备直接打交道,一般
情况下,计算机图像处理系统从系统层次上可分为高、中、
低档三个层次,目前比较普及的是低档次的系统,该系统由
cc D (摄像头)、图像采集卡、计算机三个部分组成,其结
构简单,应用方便,效果也比较不错,得到的图像较清晰,
所以目前在工程应用中采用的比较多。这就给开发人员带来一
个现实的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
,如何使用图像采集卡呢?目前虽然各种编程资
源中基于 VC开发经验的文章不少,但是关于如何在 VC开发平
台上使用图像采集卡的文章的确没发现,笔者借这期讲座的宝
贵机会,补充介绍一下如何在程序中编写自己的代码来操作图
像采集卡,从而搭建一个完整的图像处理系统。希望通过这
部分内容的学习,在读者的脑海里就可以建立一个完整的图像
操作系统概念;同时也能够给目前正需要利用图像采集卡开发
自己的图像处理系统的朋友有所帮助。
1.抖动重●
、 一 , ⋯ ⋯
, . , , . 一
在上一节讲座中,我们讲到了如何实现图象的 雕刻 和
浮雕 效果,它们的实现思想是通过求取 没有处理过的相邻
两个像素之间的差值 来实现的。如果没有限制 以前没有处
理过的两个像素之间的操作 ,取而代之的是 处理以前已经操
作过的像素 ,那末就可以将一个像素的灰度值传递到与其相
邻的若干像素。事实上,有时后我们必须通过上述的约定才能
实现一些效果,如图像的抖动效果。例如,为了使图象看起来
好象从左上角向右下角扫过,以产生运动的感觉,必须要反复
拷贝左上方的那些像素的灰度值,逐步把它们融合在一起,看
起来好象图像后边有一些颜色在逐渐的消失,这就是我们要讲
的图象的抖动效果。下面给出了该效果的实现代码:
void O)ibView::OnD
m hDIB://拷贝存放已经读取的图像文件数据旬柄
l驴Bi=(LPBnjI酗P璜融甓舶氆i)Gl曲Bl ck(∞旺棚 L^)}ldib);11获取图像信惠头
pData=(unsigned ch 神F{n∞I豫its(也眄lR)lpBi);
//FindDIBBits是我定义的—个函数,
t~c->SetWodifiedF1ag(1讯哟 :
//设置文档修改标志为 真 .为后续的修改存盘作准备
datalh~dle=GlolmlAl10c自湖雕 S鼢砸,髓讲榴订Es‘lp眦.)b dt}棚 +1弗i.)
biHeight): //声明一个缓冲区用来暂存处理届的图像数据:
day,a=(unsigned c}Ⅻ Gl。bBlImk(oI缸0B^D血talhandle);11得到该缓冲
区的指针{
AfxGetApp0->BeglnWaitO~sor0;
int£,j.buf
for(一i=lpBi一>biIl。i曲t;i~-2;i—)//从图像有下角开始对图像的各个像
素进行 辩动’处理l
for( lpBi->bi~idth;j>=2;j {
//抖动处理、从掰像的右下角开始计算图像斜上方相邻像素的均值:
buf=(*(pData+(IpBi->biHeight—i)卅I功 掰g婀Es(1pB卜>biWidth*8)+j)+搴
t射《lpBi b耋№i曲 i+1)卅l鞠嘲掰1Es(IpBi-YbiWidtb~)+ 1))/2;
if(buf>2~)bur=?,55;//陵糖像素意的灰度慈圈为0-255;
if(bufbi№i曲卜i)蚋旺I毋颤砸cs(1卿 —>bi舭dth哟
=(Bn勘bur:
}
for(j=o:jGetSafeHde()://获取视图的设备上下文旬柄;
if(1pDib !=眦 ){
上再实现一些特殊处理。 c曲ib=wlmgWidth:
笔者的摄像机采用台湾BENTECH INDUSTRIAL有限公司生 cyDib=wimgBeight:
setLogicPal(hdc。cxDib,cyDib,8)://设置调色叛; 产的CV
一 155L黑白摄像机。该摄像机分辨率为752x582。图象 Se
tStretchBItWode(Mc co∞R0l lc):
采集卡采用的是北京中科院科技嘉公司开发的基于 PCI总线的 bGrabiark=‘rm/E _
cA—MPE 1000黑白图象采集卡。一般情况下,使用图像采集 while(bGr~ark—TRUE){
if(rosa№ssage==霄 I B【玎1 础 clK)//
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
是否为鼠标双击消息; 卡分三步
, 首先安装采集卡的驱动程序,并将虚拟驱动文件 bG拍堋皱k 触 g;11妇为鼠括双击溃惠,停止采集图象{
VxD.vxd拷贝~UWindows的SYSTEM目录下;这时候就可 以进入开 W32_R~ 2J]uf(~azrrent_Frmm,lpDib)://将图象数据读入到图像数
发状态了,进入Vc开发平台,生成新的项目,由于生产厂家为 据缓冲嚣;
SetDIBitsTot)evice d岛 瓴 0,cxDit~ cyDib, o’
图像采集卡提供了以mpew32.dl1、mpew32、lib命名的库文件, q c~ib
, (LPS'm)lpDib,
库中提供了初始硬件、采集图像等函数,为使用这些函数,需 bmi,DIB RGB_COLORS)://最示图像;
} 要在新项目上连接该动态库;最后一步就是采集图像并显示处
|{ 证聚氛
理了,这一步要设置系统调色板,因为采集卡提供的是裸图形 ~
_ CaStopCapturo0;
式,既纯图像数据,没有图像的规格和调色板信息,这些需要 ::Releas~DC(6e蟠af硅却ndO.hdc):
开发者 自己
规定
关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定
实现,下面是实现的部分代码 : l
//将下嚣这令螽裁漆如在橇霉类静甜e8tView::OnSize()函数中,藏
f fff }} Ⅲ } 可以对系统的调色扳遴 瑷重 void孽玳舻I InitLogicPal(鼬c hdc
. short
CTestView::CrestViewO{ width
, short i靖 嘲 l bitCount){
W32 Init~EIO000:II初始化采集卡 int j
, i:
F32
_
Wodify Contrast(5o)://下萄的函敷是为了对爿壬集l卡进行颚{殳置 short oxDib
, czDib:
W32
_ t~odify Brightness(45);II设置亮度 La鼹酲敬豫 N~Pal;
W32
一
Set
一
1~
一 Value(945);//设置承串采集点数 j芷2∞
wCurrent Fr~ =1://当前l吱为1,获取的图像就避矾这籁取得豹 if((pLogPal=(LOC~ALElq'E*)mlloc(sizeof(LOGPALEITE)+(j*sizeof
//设置采集信号源,仅对~EIO00有效 O 日程日哪酌)) 飘D
F32~et,Inlmt
_ Source(1);11该图像采集卡支持量酪视频 霸薪采集盼图
像来自第=路j囊入端l pLo麟 弹lversion~300://设置调色版的颜色撵隐;
W32 Set PAL_Range(1250,lO2唾)://设置承平采集范隧 面a#鲰l≯pal哺 翱:rie鼙 :
~ 2
_ Set VGA Mode(1):采用P札制式; for(1瓣囊pLa#al->oalPal融}玎[j]
,~Red#i {
~rabllinX1:O:∥采集窗口的左上角豹坐标 越删赫 眦蟊 缸,
。 如 i
wGrsbWinYl;0: 城蛹 l玲 P 麟《婚£il 辍 ;i:
firstTime=TRUE;//第一次采集; 皿 gPal p蝴驽峨 【鞋
.pePl醣 0;
bGrabWo& =FIt~E;//抓翻攥黢绚自咻斌l
bZip~ode;ZIPPLE;∥愿雅攥式为ZIPPLE; 。 城 ;纛 te(pLo 1)_H~ltitltlMIi,
IpDib=NULL;,/存簸获取豹圈德救据缓)申区身美 罄 垂誓 鼬let· -
::Sel∞蠼&l戢le 臻 。国 ∥系统实瑰调雹板i
I//////////1111~1[11111/11/I/11///////// ::翻 秘赫 赫 毽蠹蚶 : :
⋯ .. ~ 一 . .. ^ _
W32
_
CIosB
_
~E10000;//蓑栩采集卡 cxDib=width;c~ib=heilg,tt;j
,
tf( 氆 嚣氆秘鬟 ll 鹱蚺糟ll fsizeaf氆囊圈翻睫瞄 壤^譬)+iisizeof
J 《粒糊瞄游羚 掇l盖
∥///IIIIIIIII//,,, ,,,,,, ,, ,,, ,, ,
■■ H
void CTestView::OnGrabonefrme0I!显暴采集静糖幕 爨击謦撅来费I停 //囊冀期蘩攘塞豢结鞫 Jlt 箍零瘸像瓣爝. mi为套禺蹙羹;
{//TO~O:Add your c伽眦rId h8嘲1er code here~ 一 bmi-)~milleader
.biSi瓣 柏
v~ t
_
Frme; iii:ii?; tmi一
- > lmil。leade r, b—i~idt h eai)I。b ;一
//设置采集丑标为矗存 b献秘鼬幽 胡馘 蠹i揍蠖 培 掰蠡
IPo2
_ CACar~ram e啦 瑚l^丑酾 强冀 脚秘: ;¨ lmi-)~ ader
. hiPl~ --1 l 一
if(1pDib!:NULL)//如果图像缓冲区不为空,辍簸该自脚区{ bmi-)bmlFm~~,biBitCotmt bitCoum :
Imi-)MIIieader.bl&mllessi濑 0 ;
GlobatUnlock(I~IbDIB): bmi->imiHeade
..r, 幽哪 :
GlobalFree(h窖lbDIB): 女嗽 搿B嘲嘛 辩帮 蜘l蚶 0;
7:1
bmi 麟 黼盱. 蝴 lI嘲 静 O:
//为采集戮的图像戤撼分鬈内存 蜘}睁b蔽釉8融氛biClrUs 重≈9:
、
1
维普资讯 http://www.cqvip.com
5.视频 ”叠中■ “技术
? = := :==■: : = : :=一
如果我们的采集卡支持多路视频信号的采集,那么有
时为了获取更多的信息,就需要采用 画中画 的技术。
画中画 这个概念大家应该都很熟悉、类似与彩色电视机
的 画中画 功能,就是在一幅大的图像内显示另外一幅内
容不 的小的图像,小图像的尺寸大小一般地说为大图像
尺寸的l/4或l/9,显示位置在大图像的右上角,当然这
个尺寸你也可以自己定义,完全由你的爱好决定。目前这
种技术不仅应用在电视技术中,在可视电话系统也可以发
现这种技术的身影,它们都是依靠硬件来实现的,但是如
何用软件实现,在Vc开发平台上用编程语言来将该功能添
加到自己开发的视频监控软件,为使用者提供更大的信息
鼍呢?也许读者最容易想到的是首先显示大图像,然后再
在一个固定位置画第二幅小图像,这种技术技术如果对于
显示静止图像当然没有问题,但是对于视频流,由于每一
秒钟需要画25帧,即25幅图像,这样一来计算机需要不
停的画不停的擦除,最终会给用户以闪烁的感觉,如何解
决这个问题呢?有的参考书上将大小图像分块显示,即大
图像首先显示时需要显示小图像的地方不显示出来,然后
再在保留的区域画小图像。这种方法要将待显示的图像数
据与显示位置的关系对应起来,容易出错不说,而且麻
烦,且速度慢,为此,我对该方法进行了改进,得到了
满意的效果。实现的代码如下:
, 一
void pictureinpicture()( I
i ’‘‘‘‘⋯ ‘‘ ‘‘’⋯ ⋯ ‘‘’’ I
CBitmsp bi~ *oldmp;//定义O)iump 既设备无关位圜对象: l
pDatal=(BYTE*)new char[biWidtt#afl{eight螭】;//biwidthat~i[ieightl
为视频采集卡获取的匿像尺寸,pDatal指向采集的图像数据缓冲区。 }
Read(pDatal,bih.biWidth*bih.billei曲t蚂);,/该函数从采集卡中获!
取彩色图像数据 : I
』
CCIientDC dc(this)://定义客户区设备上下文;
mj~4II=n BI'OfliPIb~'O://自定义的 文件信息结构,用于后面的图像显示
m
—
pB 卜>bmiHeader.biBitCount=24;//真彩色图像每个像素用三个字节表示
m pm I1->bmiHeader.biClrlmportant=O;
∞ 嘲n一>bmiHeader.biClHJsed=O; (
Ⅲ伽 卜>bmiHeader.biCompression=O;
m 蹦 Il >bmiliea~ r.biHeight=bi}leight:
m# i->biniHeader.biPlanes=l;
∞D8蛆卜>bmiHe~ er.biSiz~40;
Ⅲ 卜>b~Header,biSizelmag~ (bi霄idt}嘲 )地i}lei曲t婚:m_#m l->
bmiHeader.biWidth=biWidth;
m pl~Ii->bmil~ lar.biⅪ 1 e ter:0:
%磷 一>bmiHeaaer.biWeIsPerMeter=O://㈨ ij{“ ij{ij{iij{ ij{|i
曲 _ 蜘 啪 M dmr[bi冒idt|I1绚 m l蟪]://
翮耐(pDat82,biWidthl*bil{eight1 :////向该缓冲隧读数据
m
—p蹦I n BITMAPINFO;//定义小图像的信息头结构;
m堋艇I >bⅢilleaden biBitCount=24;
m pBMl2-YbmiHeader.biClrImportant=O;
m pI~I2->bmiHeader.biClrUsed-~ ;
m伽 2一>bmiHeader.biCompression=O;
m# 2->bmiiloadm~.biBei曲t=biHei曲tl;
∞D咖 2->bmilk~der.biPlanes~l:
m pBZfl2-YbmiHeader.biSize40;
∞ MI2一>bmiHeader.biSizelmage=WIDTHBYTES(biWidthl*8)*biHeight1.3:
毗pB 2一>bmiIleader.bi骶dtf—)iWidthl:
m p咖 2->bmil~ .biXPelsPefl~eter=O:
∞;aE~lI2一)bmiHemter.biWe1sPerlleter=O:
//下面实现莉中域的显示
CDC MemDc;//定义内存设备上下文;
QI喇喇妇蛳 ib 部C缅 ://馒内存凝各t下文 区设备t下文檎氍磐l
bitm附CreateC~patibleBitmp(tdc,biWidt~bil~ei曲臼;//创建—个能褰纳文
图像的、并且与客户区上下文相兼容的攀备无关位围
o1由印 nc SelectObject(~bimap);//将始调瘩-j 美晓圈对聋选进内存上下文{
::stretd狮ib1its堪嘲 咀一瞒 D’lo,biWidth.billei曲t’瓴 iWidth.biIM珈t'
pOata1.吁_pB l。DIB 嚼c0l 鞠∞0嘟 ://首先将夫鼹像嘶在内存设备上下文中 :
::Stretd~iblitsa触融 Ⅲj蜗.戮 巩 biWidthl。bl}lelghtl。 o.O,biWidthLbi}lei~htL
paat~ ‘Ⅱ2’B璐鹏 馐DRs。鞠 ;//再将小图像蕊在内存 £下文中
::stretcbBlt(d已mJ~C, 0,bihbiWidt bib.bi}kight,
_ 赫目目 .理j1D qnbib.
biWid bib.b主船i曲t’ 0口0nf)://将内存设备t下文中韵结果篷像显示在屏幕上。
~ SeiectObject(oldies);//恢复内存设餐上下文中的臻嫡馥圈对氯 释放蜜潦:
delete i~atal:
delete m
_
P~ l:
delete闻Bt82:
delete琏*埔I娃2:
}
注意:细心的读者会发现我们这里用到了Cbitmap类,这个类
支持DDB位图,也就是设备相关位图,以前我们在例子中都是直接
处理的Dib位图,也既是所谓的设备无关位图。通过这个例子,读
者既可以掌握如何将设备无关位图 (D i b)转换为设备相关位图
(DDB),又可以了解DDB设备相关位图的显示方法。希望这段内容读
者仔细研究推敲。
我们的图像处理讲座到本期为止基础篇的内容已经告一段落,
从下一期开始,我们将进入中级篇的内容,主要内容将涉及到利
用图像处理的理论和算法对图像的处理,如图像分割、边缘提取
等一些预处理算法。圈
维普资讯 http://www.cqvip.com