嗚嗚喔學習筆記: img2

搜尋此網誌

顯示具有 img2 標籤的文章。 顯示所有文章
顯示具有 img2 標籤的文章。 顯示所有文章

2013年10月1日 星期二

OPENCV[背景相減法]{cvAbsDiff(img1,img2,img3);}

背景相減法實作










程式碼 :


#include <cv.h>
#include <highgui.h>
#include "Header.h"

void BW(IplImage* img , int RGB )//二值化
{
  int Height=cvGetDimSize(img,0);//讀取矩陣高度
  int Width=cvGetDimSize(img,1);//讀取矩陣寬度

  //背景相減後二值化
  for(int y = 0 ; y < Height ; y++)
  for(int x = 0 ; x < Width ; x++ )
  {
               if(!(cvGet2D(img, y , x ).val[2] < RGB 
                 && cvGet2D(img, y , x ).val[1] < RGB 
                 && cvGet2D(img, y , x ).val[0] < RGB))
                    cvSet2D(img,y,x,CV_RGB(255,255,255));//特別注意 給值是 (y,x)
               else
                    cvSet2D(img,y,x,CV_RGB(0,0,0));//特別注意 給值是 (y,x)

  }
}
int main(int argc, char *argv[])
{
  IplImage* img1, *img2, *img3;

  img1=cvLoadImage("D:/image/car/p200.JPG",0);
  img2=cvLoadImage("D:/image/car/p1800.JPG",0);
  //分別給loading兩個圖片
  //先轉換為灰階 給 0

   //fun(10);
 
  if(!img1 || !img2)//判斷有無讀取到
  {
    printf("Could not load image file\n");
           system("pause");
    exit(0);
  }
 
  img3 = cvCreateImage(cvGetSize(img1),img1->depth,img1->nChannels);
  //建立新圖片img3 仿冒 img1
  cvSmooth(img1, img1, CV_GAUSSIAN, 3, 0, 0);//平滑處理
  cvSmooth(img2, img2, CV_GAUSSIAN, 3, 0, 0);
  cvAbsDiff(img1,img2,img3);
  //做背景相減


  int Height=cvGetDimSize(img3,0);//讀取矩陣高度
  int Width=cvGetDimSize(img3,1);//讀取矩陣寬度

  BW(img3 ,40);//二值化
  
   cvErode(img3,img3,0,1);//cvErode(輸入圖像,輸出圖像,element,腐蝕的次數);
   cvDilate(img3,img3,0,1);//擴張
  

  cvSaveImage("D:/image/car/ADS.PNG", img3);
  //img3 = saturate_sv(img3);


  //img3 = saturate_sv(img3);
  //2值化用 目前這裡用不到

  //開視窗 顯示 釋放
  cvNamedWindow("img1", CV_WINDOW_AUTOSIZE);
  cvNamedWindow("img2", CV_WINDOW_AUTOSIZE);
  cvNamedWindow("img3", CV_WINDOW_AUTOSIZE);
  cvShowImage("img1", img1 );
  cvShowImage("img2", img2 );
  cvShowImage("img3", img3 );
  cvWaitKey(0);
  cvReleaseImage(&img1);
  cvReleaseImage(&img2);
  cvReleaseImage(&img3);
  return 0;


}