全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1755
推到 Plurk!
推到 Facebook!

喜欢图象问题的进来!!!

尚未結案
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-23 11:30:59 IP:219.148.xxx.xxx 未訂閱
我现在遇到一个问题,就是当我在浏览实时图象的image上面任意取得一点颜色值时,发现它的颜色值,每几百豪秒的都不同,即使我的镜头对 着的是一面静止的墙壁,也会有变化,是什么原因?(我用时钟不断的取一点的颜色值) mycolor := img_1.Canvas.Pixels[x, y]; Edit1.Text:=inttostr(mycolor); 我在image上浏览图象,是参照dspack中demo中的playVideoCap来实现的。我本以为对着静止的物体,颜色值是不会变化的。而当在墙壁前面有 物体经过时,该点的颜色值就会发生变化,从而判断物体经过该点。
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-23 12:14:25 IP:219.133.xxx.xxx 未訂閱
引言: 我现在遇到一个问题,就是当我在浏览实时图象的image上面任意取得一点颜色值时,发现它的颜色值,每几百豪秒的都不同,即使我的镜头对 着的是一面静止的墙壁,也会有变化,是什么原因?(我用时钟不断的取一点的颜色值) mycolor := img_1.Canvas.Pixels[x, y]; Edit1.Text:=inttostr(mycolor); 我在image上浏览图象,是参照dspack中demo中的playVideoCap来实现的。我本以为对着静止的物体,颜色值是不会变化的。而当在墙壁前面有 物体经过时,该点的颜色值就会发生变化,从而判断物体经过该点。
VIDEO的摄象机送出来的信号,肯定是在不停变化的,再加上电路噪声等各种因素,总之在一个固定的点,颜色或亮度值都会不停地变化的。 不单同一个点在不停地变。对于相邻的两个点来说,眼睛看上去颜色完全相同的两个相邻的点,它的颜色/亮度值都肯定不同。 我猜,在这里只能取平均值了。虽然有变化,但这个变化肯定是围绕一个中心值做小幅度的上下变化。取平均值,或者设置允许误差范围,可以解决你的问题
WoodTiger
初階會員


發表:35
回覆:90
積分:25
註冊:2003-08-01

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-23 14:04:17 IP:60.191.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-25 10:09:34 IP:219.148.xxx.xxx 未訂閱
谢谢pcplayer99的热心回复。 to WoodTiger: 你好,又看到你的回复了,先谢谢你上次在另一个问题上给我的回复 其实这个问题也是上个问题的延续,上次解决了在实时浏览图象的image上面画条直线(红色),而画线的目的就是想让图象中运动的物体碰到红线的时候,触发抓图,而我没有解决如何判断物体碰到红线,我想取这条直线上的100个点(或更多),判断每点不同时间的颜色值是否相同,从而判断物体是否碰到红线。 我的软件实际用途是用来在公路上抓拍超速车辆的(结合测速雷达),而我在浏览图象上面画红线,属于其中的一个功能,当运动的车辆碰到红线时,触发抓拍。请问你有什么好的建议吗?最好给点代码提示,我也是刚刚接触视频检测。
WoodTiger
初階會員


發表:35
回覆:90
積分:25
註冊:2003-08-01

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-25 10:54:25 IP:60.191.xxx.xxx 未訂閱
引言: 谢谢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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-26 08:23:48 IP:219.148.xxx.xxx 未訂閱
to WoodTiger: 非常感谢你的又一次回复,这段代码和文字对我来说如获至宝,非常的有价值,再次感谢你。 愿你在在技术上能有更大的进步,永远开心快乐。
jinzihan_009
一般會員


發表:12
回覆:41
積分:10
註冊:2005-07-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-30 10:54:46 IP:219.148.xxx.xxx 未訂閱
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,请问如何设置?
系統時間:2024-04-26 12:04:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!