顯示具有 黃世育 標籤的文章。 顯示所有文章
顯示具有 黃世育 標籤的文章。 顯示所有文章

2009年8月31日 星期一

9/2 專研 meeting 取消

因老師 有其它事情 所以 meeting 取消
同學們的 暑期專案 與 作業 若仍有問題 要互相討論 找出Bug

2009年8月23日 星期日

8/26 meeting 取消

8/26 meeting 取消 請同學自行在家練習
9/2 進行 暑期 程式 總驗收
驗收內容 涵蓋 暑期 所指定之 所有 專案 與 作業
請 協助找尋 失聯的同學
也請 失聯的同學 利用開學前放假的時間 將 暑期指定之 專案與作業 補上

2009年8月16日 星期日

8/19 meeting 注意事項

1. 請先到的同學 借電腦教室的 Key 先進 電腦教室
2. 請將Project 3 的成果 展示在 電腦 上
3. 進行 Project 4

2009年8月12日 星期三

Project 4: 戳氣球

Step 1: 將一個 氣球 的圖片 Insert 到 視訊上
Step 2: 當手 戳到 或 碰觸到 氣球 若干次 (程式自行設計) 後
氣球 就會爆破 並產生相對的 爆破聲

2009年8月10日 星期一

8/12 meeting 注意事項

1. 請先到的同學 借電腦教室的 Key 先進 電腦教室
2. 請將Project 3 的成果 展示在 電腦 上
3. 實作 HW5 參考以下網址
http://hwshow-vip.blogspot.com/2009/05/hw5.html
4. 思考 HW5 與 Project 3 的 關聯性

也請 看到此公告的同學通知其他人 並 做回應 這兩星期的進度與遭遇問題

2009年7月27日 星期一

Project 3: 人形大挑戰

人形 以檔案 獨立 製作
使用者 需做出 類似 的人形 方可 過關

2009年7月20日 星期一

Project 2 所遭遇的 問題 與 進度

請將 Project 2: Dogs with red noses 所遭遇的問題 與 目前進度 Po到 HWShow上

2009年7月6日 星期一

Project 2: "Dogs with Red Nose (紅鼻子的狗狗)"

目標:
Color與Connected Component的處理
一般的狗狗的鼻子是黑色的, 此Project之目標是使用程式自動的將狗狗的鼻子變為紅色

作法:

1. 請同學自行選定一種狗, 如 洗衣機 選 黃金獵犬 ... (每人選取的狗種需不同),

2. 在網路上挑選十張所選狗狗的照片,

3. 撰寫 openCV程式 自動的將狗狗的鼻子變為紅色

同學在 7/15 的 Meeting時 需準備好 十張所選狗狗的照片

2009年6月25日 星期四

下一次 Meeting

時間與第點:
七月 15 日 早上 9:00 在 老師 辦公室 集合 請勿遲到

討論內容:所買openCV之書籍的 第6章 圖像處理 請用心準備

本章共有8個程式 每人負責一個作報告

報告時之步驟
1. 執行該程式
2. 講解所其功能與原理
3. 所使用之openCV函數

請同學 回應 你所負責的 程式

2009年6月23日 星期二

Project 1: "老師又"

題目:
電腦出題 請同學 舉起 右手 或 左手
經由WebCam 電腦可擷取同學 的畫面 電腦再判斷 同學 有沒有舉對手

範例:
請你 舉起右手來 舉起左手來 放下左手 兩手都舉起來 ...

研究對象:
x-axis projection values of difference frames

執行步驟:
Step 1: 完成 x-axis projection 圖
Step 2: 限定只有一個玩家 利用 x-axis projection 找出 玩家 頭 左肩 右肩 之位置 並產生 相關之輔助線
Step 3: 限定只有一個玩家 可偵測 玩家舉起 左手 或 右手
Step 4: 擴充 程式 可以 有兩個玩家
Step 5: 擴充 程式 電腦 可以聲音方式 隨機出題 讓兩個玩家進行 PK
Step 6: 特殊 手勢 之處理 (如 右手舉到 左前方 ... 等)

2009年6月10日 星期三

HW8-視訊webcam之應用

#include
#include
#include

#define x1 0
#define y1 0
#define alpha 0.5


int main()
{
CvCapture *capture;
IplImage *frame;
IplImage *frame1;
IplImage *frame3;
IplImage *gray;
IplImage *cgray;
IplImage *pgray;
IplImage *background1;
IplImage *background2;
IplImage *difference1;
IplImage *difference2;
IplImage* logoImg = NULL;

capture=cvCreateCameraCapture(0);
cvNamedWindow("Webcam",1);
cvNamedWindow("Webcam1",1);
cvNamedWindow("Webcam2",1);
//cvNamedWindow("Webcam3",1);

CvVideoWriter *writer;
char AviFileName[]="Output.avi";
int AviForamt = -1;
int FPS = 25;
CvSize AviSize = cvSize(640,480);
int AviColor = 1;
writer=cvCreateVideoWriter(AviFileName,AviForamt,FPS,AviSize,AviColor);

frame1 = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 3);
frame3 = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 3);
gray = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
cgray = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
background1 = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
background2 = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
difference1 = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);
difference2 = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1);

logoImg=cvLoadImage("logo.jpg");

frame = cvQueryFrame(capture);
cvFlip( frame, 0, 1);
cvCvtColor(frame, background1, CV_BGR2GRAY);
background2=cvCloneImage(background1);
int i=0;
while(true)
{
frame = cvQueryFrame(capture);

cvFlip( frame, 0, 1);
cvCvtColor(frame, cgray, CV_BGR2GRAY);
cvAbsDiff(cgray, background1, difference1);
cvFlip( difference1, 0, 0);
cvThreshold(difference1,difference1,50,255,CV_THRESH_BINARY);

cvAbsDiff(cgray, background2, difference2);
cvFlip( difference2, 0, 0);
cvThreshold(difference2,difference2, 50,255,CV_THRESH_BINARY);
background2=cvCloneImage(cgray);

/*
for (int y=0; yheight; y++) {
uchar* ptr1=(uchar*) (logoImg->imageData +y*logoImg->widthStep);
uchar* ptr2=(uchar*) (frame->imageData +(y+y1)*frame->widthStep);
for (int x=0; xwidth; x++) {
ptr2[3*(x+x1)]=alpha*ptr1[3*(x+x1)] + (1-alpha)*ptr2[3*(x+x1)];
ptr2[3*(x+x1)+1]=alpha*ptr1[3*(x+x1)+1] + (1-alpha)*ptr2[3*(x+x1)+1];
ptr2[3*(x+x1)+2]=alpha*ptr1[3*(x+x1)+2] + (1-alpha)*ptr2[3*(x+x1)+2];
}
}

*/

//cvWriteFrame(writer,frame);

cvShowImage("Webcam",frame);
cvShowImage("Webcam1",difference1);
cvShowImage("Webcam2",difference2);


if(cvWaitKey(100)>0) break;
i++;
}

cvReleaseCapture(&capture);
// cvReleaseVideoWriter(&writer);
cvDestroyWindow("Webcam");
cvDestroyWindow("Webcam1");
//cvDestroyWindow("Webcam2");
//cvDestroyWindow("Webcam3");
}

2009年6月4日 星期四

HW7 - Callback function (以Mouse為例)

改寫HW5程式, 可使Logo可以依照Mouse的目前位置, 動態坎入fruits影像中



//onMouse callback function
cvSetMouseCallback("mergesrc",onMouse,NULL);
onMouse(0,0,0,1,NULL);

void onMouse(int Event,int x1,int y1,int flags,void* param )
{

if (Event == CV_EVENT_MOUSEMOVE) {
if( (logoImg->height + y1) <>height) {
// Insert lego into an image

}
}
}

HW6 - Callback function (以Trackbar為例)

製作一 Trackbar 用以調整灰階影像成為黑白影像之Threshold值


char TrackbarName[]="Threshold";
int TrackbarInitValue=127;
int TrackbarStopValue=255;
IplImage* gray = NULL;
IplImage* bw = NULL;

int main( int argc, char** argv )
{

// Show Trackbar
cvCreateTrackbar(TrackbarName,"ShowTrackbar",
&TrackbarInitValue,TrackbarStopValue,onTrackbar);


onTrackbar(127);

cvWaitKey(0); //等待按鍵

}

void onTrackbar(int position)
{
cvThreshold(gray, bw,position,255,CV_THRESH_BINARY);
cvShowImage("Show Trackbar",bw);
}

在此程式中 onTrackbar() 即為一Callback Function
它是用來給系統呼叫的Function

在使用Callback Function時, 你的程式須向系統作簽到的動作, 即你要使用哪一個Callback Function, 此程式cvCreateTrackbar()指令即為此用途, 當系統有相對事件發生後, 此Callback Function就會被執行

問題:
請上網查 Callback Function 的定義

1. 程式中 cvWaitKey(0) 若不執行會如何 ???
2. cvWaitKey(0) 在 cvCreateTrackbar() 之前又會怎樣 ???
3. onTrackbar(127); 可不執行嗎 ???

2009年6月1日 星期一

HW4-1

請問: HW4 程式中 ptr1, ptr2 有何作用 ???
y 在程式第一層 for loop 意義為何 ???
x 在程式第二層 for loop 意義為何 ???
bw->width, bw->widthStep 有何不同 ???
有時 x 要乘以 3 有時不用 原因為何 ???
程式中 bw->width 與 bw->widthStep 可互換嗎 ??? 舉個例子


延伸:
用一層 for loop 完成以上所有動作
將一張影像作 鏡射 (Mirror)

HW5-1

完成以下 影像


2009年5月31日 星期日

HW5-使用pointer的方式直接access兩張影像中pixel的數值

// Insert a logo into an image



mergeImg=cvCloneImage(pImg);
for (int y=0; yheight; y++) {
uchar* ptr1=(uchar*) (logoImg->imageData +y*logoImg->widthStep);
uchar* ptr2=(uchar*) (mergeImg->imageData +(y+y1)*mergeImg->widthStep);
for (int x=0; xwidth; x++) {
ptr2[3*(x+x1)]=alpha*ptr1[3*(x)] + (1-alpha)*ptr2[3*(x+x1)];
ptr2[3*(x+x1)+1]=alpha*ptr1[3*(x)+1] + (1-alpha)*ptr2[3*(x+x1)+1];
ptr2[3*(x+x1)+2]=alpha*ptr1[3*(x)+2] + (1-alpha)*ptr2[3*(x+x1)+2];
}
}

HW4-使用pointer的方式直接access黑白與彩色影像中pixel的數值

// convert white pixels to black pixels and black pixels to white pixels
for (int y=0; yheight; y++) {
uchar* ptr1=(uchar*) (bw->imageData +y*bw->widthStep);
uchar* ptr2=(uchar*) (wb->imageData +y*wb->widthStep);
for (int x=0; xwidth; x++) {
ptr2[x]=255-ptr1[x];
}
}


// Get blue pixels
for (int y=0; yheight; y++) {
uchar* ptr1=(uchar*) (pImg->imageData +y*pImg->widthStep);
uchar* ptr2=(uchar*) (bImg->imageData +y*bImg->widthStep);
for (int x=0; xwidth; x++) {
ptr2[3*x]=ptr1[3*x];
ptr2[3*x+1]=0;
ptr2[3*x+2]=0;
}
}

// Get green pixels
for (int y=0; yheight; y++) {
uchar* ptr1=(uchar*) (pImg->imageData +y*pImg->widthStep);
uchar* ptr2=(uchar*) (gImg->imageData +y*gImg->widthStep);
for (int x=0; xwidth; x++) {
ptr2[3*x]=0;
ptr2[3*x+1]=ptr1[3*x+1];
ptr2[3*x+2]=0;
}
}

// Get red pixels
for (int y=0; yheight; y++) {
uchar* ptr1=(uchar*) (pImg->imageData +y*pImg->widthStep);
uchar* ptr2=(uchar*) (rImg->imageData +y*rImg->widthStep);
for (int x=0; xwidth; x++) {
ptr2[3*x]=0;
ptr2[3*x+1]=0;
ptr2[3*x+2]=ptr1[3*x];
}
}

2009年5月25日 星期一

HW3-cvThreshold()之參數深入解析

請執行
cvThreshold( gray, bw, 127, 255, CV_THRESH_BINARY );
cvThreshold( pImg, pImg2, 127, 255, CV_THRESH_BINARY );

請問
1. 這兩個指令 有何不同 ?
2. pImg2這張影像 最多可能有幾種顏色 ?

延伸題目:
將 bw影像 白點變黑點 黑點變白點

2009年5月19日 星期二

多討論 多討論 多討論

有行動 多討論 就對啦

CV_THRESH_BINARY 是 cvThreshold() 函數 弟三個 參數 他的意思是說 cvThreshold() 函數 的輸出結果 只有 2 (BINARY) 種數值

2009年5月17日 星期日

HW2- IplImage之應用與cvCvtColor(),cvThreshold(),cvCanny()之使用

執行 下列程式
請問 這程式的目的為何 ??? 有哪些 你看不懂的


-------------------------------------------
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"

int main( int argc, char** argv )
{
//聲明IplImage指針
IplImage* pImg = NULL;
IplImage* pImg2 = NULL;
IplImage* gray = NULL;
IplImage* bw = NULL;
IplImage* pCannyImg = NULL;



//載入圖像,強制轉化為Gray

pImg=cvLoadImage("fruits.jpg");


//為圖像申請空間

pImg2 = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 3);

gray = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 1);

bw = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 1);

pCannyImg = cvCreateImage(cvGetSize(pImg),
IPL_DEPTH_8U,
1);

//cvCvtColor彩色轉灰階
cvCvtColor(pImg, gray, CV_BGR2GRAY);

//cvThreshold灰階轉黑白
cvThreshold( gray, bw, 63, 255, CV_THRESH_BINARY );

cvThreshold( pImg, pImg2, 127, 255, CV_THRESH_BINARY );


//canny邊緣檢測
cvCanny(gray, pCannyImg, 50, 150, 3);

//創建視窗
cvNamedWindow("src", 1);
cvNamedWindow("src2",1);
cvNamedWindow("blackwhite", 1);
cvNamedWindow("gray",1);
cvNamedWindow("canny",1);


//顯示圖像
cvShowImage( "src", pImg );
cvShowImage( "src2", pImg2 );
cvShowImage( "gray", gray );
cvShowImage( "blackwhite", bw );
cvShowImage( "canny", pCannyImg );

cvWaitKey(0); //等待按鍵

//銷毀視窗
cvDestroyWindow( "src" );
cvDestroyWindow( "src2" );
cvDestroyWindow( "canny" );
cvDestroyWindow( "blackwhite" );
cvDestroyWindow( "gray" );

//釋放圖像
cvReleaseImage( &pImg );
cvReleaseImage( &pImg2 );
cvReleaseImage( &gray);
cvReleaseImage( &bw );
cvReleaseImage( &pCannyImg );

}