IplImage* pImg = NULL;
IplImage* pImg2 = NULL;
//載入圖像
pImg=cvLoadImage("fruits.jpg");
//為圖像申請空間
pImg2 = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 3);
//要轉成黑白的照片 channel要用1
gray = cvCreateImage(cvSize(pImg->width,pImg->height), IPL_DEPTH_8U, 1);
//直接取得大小寫法
pCannyImg = cvCreateImage(cvGetSize(pImg), IPL_DEPTH_8U, 1);
IplImage 的資料結構
IplImage//cvCvtColor彩色轉灰階
|-- int nChannels; // Number of color channels (1,2,3,4) 1是黑白 3是彩色
|-- int depth; // Pixel depth in bits: U是Unsigned S是Signed 以及用幾個bit編碼
| // IPL_DEPTH_8U, IPL_DEPTH_8S,
| // IPL_DEPTH_16U,IPL_DEPTH_16S,
| // IPL_DEPTH_32S,IPL_DEPTH_32F,
| // IPL_DEPTH_64F
|-- int width; // image width in pixels
|-- int height; // image height in pixels
cvCvtColor(pImg(src), gray(des), CV_BGR2GRAY);
//cvThreshold灰階轉黑白 63 , 255為門檻值,會因bit數不同而有不同的range,如果是8 bits就是0~255
cvThreshold( gray(src), bw(des), 63, 255, CV_THRESH_BINARY );
//canny邊緣檢測
cvCanny(gray(src), pCannyImg(des), 50, 150, 3);
把作業1和2融合,這樣就可以產生一個抓到影像的視窗 跟HW1用的複製方式不同
IplImage *frame;
IplImage *frame1;
frame = cvQueryFrame(capture); //抓到的影像顯示在frame上
frame1 = cvCreateImage(cvSize(frame->width,frame->height), IPL_DEPTH_8U, 1);
Modify the vaue of the third parameter in cvThreshold( gray, bw, 127, 255, CV_THRESH_BINARY ); such that your face becomes black.
Find the differences between cvThreshold( gray, bw, 127, 255, CV_THRESH_BINARY );
cvThreshold( pImg, pImg2, 127, 255, CV_THRESH_BINARY );右上角為原始圖像
左上為cvThreshold( pImg, pImg2, 127, 255, CV_THRESH_BINARY );
左下為cvThreshold( gray, bw, 127, 255, CV_THRESH_BINARY );
左上是把彩色照片直接改成黑白,左下是把灰階照片改為黑白
結果就是一個依然是彩色的(顏色較深的才會變成黑色 較淺的依然還是彩色) 一個是真正黑白
How many colors in the pImg2 image?
8種 因為他是彩色圖片 有RGB3個 所以有2^3=8種組合
Use cvResize() function to extend HW02.cpp such that the displayed image is enlarged by a factor of 3.14.
用法是 cvResize(pImg(src), pImg2(des) ,CV_INTER_LINEAR(使用的演算法));
演算法還有以下可選擇
- CV_INTER_NN
- CV_INTER_LINEAR -used by default
- CV_INTER_AREA -
做局部放大適用 - CV_INTER_CUBIC
pImg2 = cvCreateImage(cvSize(pImg->width*3.14,pImg->height*3.14), IPL_DEPTH_8U, 3);
(Optional) Study functions of cvDilate() and cvErode().
cvDilate()
使用任意結構元素膨脹圖像
void cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL,
int iterations=1);
- src輸入圖像.
- dst輸出圖像.
- element用於膨脹的結構元素。若為 NULL, 則使用 3×3 長方形的結構元素
- iterations膨脹的次數
cvErode()
使用任意結構元素腐蝕圖像
void cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element=NULL,
int iterations=1);
- src輸入圖像.
- dst輸出圖像.
- element用於腐蝕的結構元素。若為 NULL, 則使用 3×3 長方形的結構元素
- iterations腐蝕的次數
沒有留言:
張貼留言