喜欢图象问题的进来!!! |
尚未結案
|
jinzihan_009
一般會員 發表:12 回覆:41 積分:10 註冊:2005-07-22 發送簡訊給我 |
我现在遇到一个问题,就是当我在浏览实时图象的image上面任意取得一点颜色值时,发现它的颜色值,每几百豪秒的都不同,即使我的镜头对 着的是一面静止的墙壁,也会有变化,是什么原因?(我用时钟不断的取一点的颜色值)
mycolor := img_1.Canvas.Pixels[x, y];
Edit1.Text:=inttostr(mycolor); 我在image上浏览图象,是参照dspack中demo中的playVideoCap来实现的。我本以为对着静止的物体,颜色值是不会变化的。而当在墙壁前面有 物体经过时,该点的颜色值就会发生变化,从而判断物体经过该点。
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
引言: 我现在遇到一个问题,就是当我在浏览实时图象的image上面任意取得一点颜色值时,发现它的颜色值,每几百豪秒的都不同,即使我的镜头对 着的是一面静止的墙壁,也会有变化,是什么原因?(我用时钟不断的取一点的颜色值) mycolor := img_1.Canvas.Pixels[x, y]; Edit1.Text:=inttostr(mycolor); 我在image上浏览图象,是参照dspack中demo中的playVideoCap来实现的。我本以为对着静止的物体,颜色值是不会变化的。而当在墙壁前面有 物体经过时,该点的颜色值就会发生变化,从而判断物体经过该点。VIDEO的摄象机送出来的信号,肯定是在不停变化的,再加上电路噪声等各种因素,总之在一个固定的点,颜色或亮度值都会不停地变化的。 不单同一个点在不停地变。对于相邻的两个点来说,眼睛看上去颜色完全相同的两个相邻的点,它的颜色/亮度值都肯定不同。 我猜,在这里只能取平均值了。虽然有变化,但这个变化肯定是围绕一个中心值做小幅度的上下变化。取平均值,或者设置允许误差范围,可以解决你的问题 |
WoodTiger
初階會員 發表:35 回覆:90 積分:25 註冊:2003-08-01 發送簡訊給我 |
inzihan_009你好:
你是不是在寫類似與“看門狗”的軟體,需要判斷有無物體經過某一區域?
如果是這樣,我的看法是,不能用絕對變化,應該用相對變化:
肉眼看上去相同的圖像,特別是實時的圖像,很可能會有細小的差別,如果直接用img_1.Canvas.Pixels[x, y]來判斷是否有變化,是不合適的。這些細小的差別很可能由:光線、設備的抖動等等因素造成。
建義用以下的方法來進行判斷:
實時求某一區域的的平均灰度值avgGray,設置一個判斷閾值dGray,如果後一個argGray與前一個argGray的灰度值變化的絕對值大於dGray則認爲有變化,否則認爲無變化。
附求某一點灰度值公式供你參攷:
gray:=round(rgbtRed*0.3) round(rgbtGreen*0.59) round(rgbtBlue*0.11)
祝順心! ==================================
搞得懂就答人,搞不懂就問人,沒有人懂還可以問神!
------
-=-=-=-=-=-=-=-=-=-=-= Eveything as your wish. |
jinzihan_009
一般會員 發表:12 回覆:41 積分:10 註冊:2005-07-22 發送簡訊給我 |
谢谢pcplayer99的热心回复。
to WoodTiger:
你好,又看到你的回复了,先谢谢你上次在另一个问题上给我的回复
其实这个问题也是上个问题的延续,上次解决了在实时浏览图象的image上面画条直线(红色),而画线的目的就是想让图象中运动的物体碰到红线的时候,触发抓图,而我没有解决如何判断物体碰到红线,我想取这条直线上的100个点(或更多),判断每点不同时间的颜色值是否相同,从而判断物体是否碰到红线。
我的软件实际用途是用来在公路上抓拍超速车辆的(结合测速雷达),而我在浏览图象上面画红线,属于其中的一个功能,当运动的车辆碰到红线时,触发抓拍。请问你有什么好的建议吗?最好给点代码提示,我也是刚刚接触视频检测。
|
WoodTiger
初階會員 發表:35 回覆:90 積分:25 註冊:2003-08-01 發送簡訊給我 |
引言: 谢谢pcplayer99的热心回复。 to WoodTiger: 你好,又看到你的回复了,先谢谢你上次在另一个问题上给我的回复 其实这个问题也是上个问题的延续,上次解决了在实时浏览图象的image上面画条直线(红色),而画线的目的就是想让图象中运动的物体碰到红线的时候,触发抓图,而我没有解决如何判断物体碰到红线,我想取这条直线上的100个点(或更多),判断每点不同时间的颜色值是否相同,从而判断物体是否碰到红线。 我的软件实际用途是用来在公路上抓拍超速车辆的(结合测速雷达),而我在浏览图象上面画红线,属于其中的一个功能,当运动的车辆碰到红线时,触发抓拍。请问你有什么好的建议吗?最好给点代码提示,我也是刚刚接触视频检测。提個建議供你參攷 可以以dt爲時間間隔不停的用scanline快速取出一整行,然後計算其平均灰度avgGray,另設置一個0~255之間的閾值dtGray,如果avgGray(t)-avgGray(t-dt)的絕對值大於dtGray,就認爲有物體碰到了紅線。 scanline與計算灰度的算法,請參攷“圖像二值化”的相關算法。以下是我以前的一個用到“二值化”的代碼片段,供你參攷: procedure TfrmVideoCap.btn2VarClick(Sender: TObject); type pArr =^TRGBTripleArray; TRGBTripleArray = array [Byte] of TRGBTriple; var xp:PArr; Gray,x,y:integer; begin img2Var.Picture.LoadFromFile('save\pic1.bmp'); for y:=0 to img2Var.Picture.Bitmap.Height-1 do begin xp:=img2Var.Picture.Bitmap.ScanLine[y]; for x:=0 to img2Var.Picture.Bitmap.Width-1 do begin ////////////////這是求灰度//////////////////////////////// Gray:=round(xp[x].rgbtRed*0.3) round(xp[x].rgbtGreen*0.59) round(xp[x].rgbtBlue*0.11); ////////////////加上統計平均與dtGray判斷/////////////////// if Gray > strtoint(edt2Varbrd.Text) then begin xp[x].rgbtRed:=$FF; xp[x].rgbtGreen:=$FF; xp[x].rgbtBlue:=$FF; end else begin xp[x].rgbtRed:=$00; xp[x].rgbtGreen:=$00; xp[x].rgbtBlue:=$00; end; end; end; end;你可以不必整張圖片求灰度,只需求紅線所在行即可,試試看,但願有用。 祝順心! ================================== 搞得懂就答人,搞不懂就問人,沒有人懂還可以問神! 發表人 - woodtiger 於 2005/08/25 11:04:59
------
-=-=-=-=-=-=-=-=-=-=-= Eveything as your wish. |
jinzihan_009
一般會員 發表:12 回覆:41 積分:10 註冊:2005-07-22 發送簡訊給我 |
|
jinzihan_009
一般會員 發表:12 回覆:41 積分:10 註冊:2005-07-22 發送簡訊給我 |
to WoodTiger:能帮我看看下面这个另一个问题吗?
本人用的为dspack组件。笔记本接sony DV 90E.1394线
我用IAMStreamConfig接口实现的方法,代码如下: var
VideoStreamConfig : IAMStreamConfig;
AMMEdiaType : PAMMediaType;
begin
FilterGraph.ClearGraph;
FilterGraph.Active := false;
Filter.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag);
FilterGraph.Active := true;
with FilterGraph as ICaptureGraphBuilder2 do
begin
FindInterface(@look_downstream_only, nil, Filter as IBaseFilter, IID_IAMStreamConfig, VideoStreamConfig);
VideoStreamConfig.GetFormat(AMMEdiaType);
PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biWidth:= 320;
PVideoInfoHeader(AMMEdiaType.pbFormat)^.bmiHeader.biHeight:= 240;
AMMEdiaType.subtype := MEDIASUBTYPE_RGB24;
VideoStreamConfig.SetFormat(AMMEdiaType^);
DeleteMediaType(AMMEdiaType);
RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter);
end;
FilterGraph.Play; 为什么,我抓拍的图片都是720*576的,即感觉bmiHeader.biHeight的值是默认值(720*576)。为什么设置成功了,但不起作用呢?请问如何在dspack中调节分辨率呢?我想抓到320*240,请问如何设置?
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |