2012年6月4日 星期一

HW03

第三次的作業分成(a)(b)兩部分,a部分的相框真的是讓我吃足了苦頭,本來在上課時已經有做出來了,回家後改一改卻一直無法正確顯示,程式雖然能執行,但相框卻好像被視訊視窗覆蓋住一樣,如下圖
  














後來重新再做一次,步驟很簡單,程式碼幾乎跟龍珠的一樣,只要照著打再小做修改就可以完成這次的作業。
以下是回傳函數修改的範例
 ucDragonBallRGB[iDragonBallID][j-iObjectY1][i-iObjectX1][0] != 0
 這行是龍珠的四維RGB陣列,分別儲存[龍珠編號][龍珠圖片的長][龍珠圖片的寬][紅色像素]另外兩行以此類推,只要修改成相框適用的三維陣列image2RGB[j][i][0] != 0就可以了,除非有需要做一個以上的相框,否則就沒有編號必要,因此就可以把第一維的陣列刪去,YUV陣列也是比照辦理,而不用減iObjectXY1的原因是相框的大小原本就會調整成和視訊擷取視窗的大小相同。
接下來只要在按鈕中將事先使用 capGetVideoFormat 來取得視訊內容的高與寬,再把相框的位置設定為視訊擷取視窗的大小就可以了,如下。
iObjectWidth = iVideoWidth;

iObjectHeight = iVideoHeight;
再將影像元件中的色彩資料放到陣列中,這邊一樣只需要用三維陣列。
image2RGB[j][i][0] = (unsigned char) iB;
最後再利用部落格的公式將RGB轉換為YUV就大功告成了。
















(完成圖)


b部分相較起來就簡單的多,只要將畫面轉換為灰階就可以完成。
















做法有兩種,一種是直接修改ptrCapture[k+1]和ptrCapture[k+3]的值,灰階的值都是128,另一種做法是跟元件Color Dialog做連結,就可以自己選擇喜歡的顏色,連結的程式碼如下
if (ColorDialog1->Execute())
iR = GetRValue(ColorDialog1->Color);
iG = GetGValue(ColorDialog1->Color);
iB = GetBValue(ColorDialog1->Color);
再將RGB用公式轉換為YUV即可。

我在Coding的過程中有發生一個問題,和元件做好連結後,選的顏色卻和顯示出來的顏色不同,如下圖
















我原本選的顏色是黑色,但畫面上卻顯示為奇怪的綠色,經過debug後發現,原來是我ptrCapture[k+3]的值放錯,將iV放成了iY,改正後顏色也便正常了。

 












(黑白照)

















(靈異綠照)

















 (情色紅照)

沒有留言: