1.
這學期的課程,大致上可分為兩個部分,一是Arduino、一是OpenCv視訊,若真要說,我想我最喜歡的是後半部分─OpenCV視訊;過去由於我幾乎沒有修過多媒體類的課程,因此淺意識中認為多媒體課程的程式很困難、很複雜,其實不然,修完課之後才發覺其實用心去聽、去學,這些小問題都不算甚麼。
2.
這學期我學會了插麵包板、撰寫Processing、Arduino以及OpenCV相關程式,也學到了遇到困難要如何去找出問題所在、處理方法以及解決問題。
3.
我開始會運用手邊資源去找出解決的方法,並且面對問題所在,而非逃避問題。
而程式方面,撰寫硬體與軟體結合的程式,對我來說卻是跨出了一大步。
2013年6月9日 星期日
2013年6月8日 星期六
OpenCV-期末考 99360754 陳威任
期末考時,我所想到的方法是,利用三張圖片,第一張放兩個皇冠,第二張、第三張分別是單一皇冠,利用之前所教的皮膚偵測+指標判斷臉部位置,再利用X軸去判斷人所在地方是左,或是右
不過當時由於判斷條件寫錯,導致只寫出紅線以及雙皇冠。
最後修改為 單一皇冠(左、右冠)圖片兩張
修改後程式碼:
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include "stdio.h"
int main()
{
IplImage * frame;
IplImage* mergeImg = NULL; //複製
IplImage* crown01 = NULL;//皇冠1
IplImage* crown02 = NULL; //皇冠2
IplImage* pImg1 = NULL; //皮膚偵測用
int mouseX=0;
int mouseY=0;
CvCapture * capture = cvCreateCameraCapture(0);
frame=cvQueryFrame(capture); //讀取視訊畫面
後來發現程式會當掉原因在此,申請圖片空間之前,需要先抓一次畫面
//為圖片申請空間
mergeImg = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 3);
pImg1 = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 1);
cvNamedWindow("Webcam",0);
cvNamedWindow("Webcam1",0);
//讀取圖片檔案
crown01 = cvLoadImage("Crown02.jpg");
crown02 = cvLoadImage("Crown04.jpg");
while(true)
{
frame=cvQueryFrame(capture);//讀進畫面
cvFlip(frame,frame,1);//翻轉
cvCvtColor(frame, frame, CV_BGR2YCrCb);//轉換色彩空間
// 膚色轉白其他轉黑,顏色下限與上限
cvInRangeS(frame, cvScalar(0,137,77), cvScalar(256,177,127),pImg1);
frame=cvQueryFrame(capture); //再轉回原本視訊影像
cvFlip(frame,frame,1);
mergeImg=cvCloneImage(frame); //複製原本的畫面至mergeImg
//劃線
cvLine(mergeImg,cvPoint(150,0),cvPoint(150,255),CV_RGB(255,0,0),3,8,0);
int redPixelNumber=0;
int redPixelX=0;
int redPixelY=0;
//抓取膚色後變為白色
for (int y=0; y<pImg1->height; y++)
{
uchar* ptr1=(uchar*) (pImg1->imageData +y*pImg1->widthStep);
for (int x=0; x<pImg1->width; x++)
{
if(ptr1[x]==255)
{
redPixelNumber++;
redPixelX+=x;
redPixelY+=y;
}
}
}
//變白色之後找平均點為了要帶皇冠
if (redPixelNumber>0)
{
mouseX=redPixelX/redPixelNumber;
mouseY=redPixelY/redPixelNumber;
}
//將皇冠固定在頁面上
for (int y=0; y<crown01->height; y++)
{
//原圖
uchar* ptr1=(uchar*) (mergeImg->imageData +(y)*mergeImg->widthStep);//原本畫面
uchar* ptr2=(uchar*) (crown01->imageData +y*crown01->widthStep);// 皇冠 1
uchar* ptr3=(uchar*) (crown02->imageData +y*crown02->widthStep);// 皇冠 2
//寫入第一皇冠(左)
for (int x=0; x<crown01->width; x++)
{
if(ptr2[3*x]!=255)
{
ptr1[3*(x+20)]=ptr2[3*(x)];
ptr1[3*(x+20)+1]=ptr2[3*(x)+1];
ptr1[3*(x+20)+2]=ptr2[3*(x)+2];
}
}
//寫入第二皇冠(右)
for (int x=0; x<crown02->width; x++)
{
if(ptr2[3*x]!=255)
{
ptr1[3*(x+180)]=ptr3[3*(x)];
ptr1[3*(x+180)+1]=ptr3[3*(x)+1];
ptr1[3*(x+180)+2]=ptr3[3*(x)+2];
}
}
}
// 偵測第一個皇冠會在頭上
for (int y=0; y<crown01->height; y++)
{
uchar* ptr1=(uchar*) (mergeImg->imageData +(y+mouseY-170)*mergeImg->widthStep);
uchar* ptr2=(uchar*) (crown01->imageData + y*crown01->widthStep);
for (int x=0; x<crown01->width; x++)
{
if(mouseX <150)if(ptr2[3*x]!=255)
{
ptr1[3*(x+mouseX-60)]=ptr2[3*(x)] ;
ptr1[3*(x+mouseX-60)+1]=ptr2[3*(x)+1] ;
ptr1[3*(x+mouseX-60)+2]=ptr2[3*(x)+2] ;
}
}
}
// 偵測第二個皇冠會在頭上
for (int y=0; y<crown02->height; y++)
{
uchar* ptr1=(uchar*) (mergeImg->imageData +(y+mouseY-170)*mergeImg->widthStep);
uchar* ptr2=(uchar*) (crown02->imageData + y*crown02->widthStep);
for (int x=0; x<crown02->width; x++)
{
if(mouseX >155)if(ptr2[3*x]!=255)
{
ptr1[3*(x+mouseX-60)]=ptr2[3*(x)] ;
ptr1[3*(x+mouseX-60)+1]=ptr2[3*(x)+1] ;
ptr1[3*(x+mouseX-60)+2]=ptr2[3*(x)+2] ;
}
}
}
cvShowImage("Webcam",pImg1 );
cvShowImage("Webcam1",mergeImg );
char key = cvWaitKey(33);
if(key == 27)break;
}
}
其實考試的東西不難,不過需要思考一下才能想到如何去寫
OpenCV-期末專案-視訊小畫家
心得:
期末專案原先是想做出小畫家,可以利用手指畫的
但遇到的困難是,
如果用皮膚偵測的話會很難確定是手指
所以才改成用滑鼠代替手指
利用滑鼠左右鍵做出不同的顏色
再利用萬花筒做出不一樣的效果。
很有趣,不知道原來視訊上面可以畫畫!!
Arduino-期中專案-撈魚
心得:
期中專案花了蠻多時間做的,因為還要加上硬體的製作
就算程式碼成功寫出來,也要配上硬體能成功搭配,
先是程式碼的完成,但硬體不知道怎麼才能做出來
希望能有上下左右四個方向的按鈕,
但是後來不知道為什麼一直接觸不良,
最後只好剩下兩個上下的按鈕。
雖然展出很成功,但只剩下兩個按鈕很可惜
Arduino-鋼琴 99360754 陳威任 99361075 王品雯
心得:
Arduino利用小喇叭可以做出鋼琴我也覺得好酷!!
一個聲音很簡單,但兩個三個甚至是八個聲音,
就連電路板都要思考一下,光線路就花了一段時間
程式碼一開始也不知道要怎麼讓聲音不同
花了一段時間後終於順利先用出三個,直到順利用出八個聲音
但不知道是不是按鈕接觸不良的關係,
按到某一個按鈕的聲音會一直不停止
Arduino-水果盤 99360754 陳威任 99361075王品雯
心得:
Arduino做的水果盤,原本以為水果盤一定很難!
一開始連麵包板的線路也不知道怎麼接
程式碼也是一直用不出來不知道錯在哪裡,
後來Debug完也順利找到錯誤可以執行,
原來水果盤不算難,而且好好玩~~
原來水果盤不算難,而且好好玩~~
超級有成就感 :)
Arduino-LED漸亮 99360754 陳威任 99361075王品雯
心得:
這是我們第一次接觸Arduino的東西,感覺很新奇,
一直聽到Arduino不知道是什麼,原來是一塊板子!!
USB當作電源輸入,LED燈當輸出
打幾行程式碼燈就會亮,跟組合語言比起來簡單多了~
2013年6月1日 星期六
2013年5月27日 星期一
偵測膚色,十字指標 99360754 陳威任 99361075王品雯
心得:
這是新接觸到的東西,剛接觸總是覺得很難,
確定在執行的時候也有遇到問題。
隨著偵測白色的出現而會算出新的平均值,
再會改變十字的位子。
但為什麼十字都不出現一直是我們的問題。
後來終於順利出現十字了!!!!!
感覺很酷,也很新奇。
2013年4月29日 星期一
相框99360754 - 99361075
心得:
相框的效果感覺好酷!!!
一開始頻頻失敗,程式碼跑一跑就會自己當掉
當程式碼順利可以跑的時候相框又不會出現 :(
圖片大小還要剛好跟視訊大小一樣大...
明明看似都用好了,但卻還是無法執行。
後來拜託別人幫忙Debug就搞定了!!
很多小細節要注意,看似簡單卻困難重重
2013年4月22日 星期一
訂閱:
文章 (Atom)











