嗚嗚喔學習筆記: OPENCV[背景相減法]{cvAbsDiff(img1,img2,img3);}

搜尋此網誌

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;


}

12 則留言:

  1. 為啥我跑不出來??

    回覆刪除
    回覆
    1. 你可能要先安裝好OPENCV 或是你的圖片有置入有錯喔

      刪除
  2. 請問Header.h是什麼啊?
    需要另外抓嗎?

    回覆刪除
  3. 請問作者大大有寫過前景相減嗎?
    或是整張圖片相減?有點看不懂 背景是怎麼產生跟怎麼相減的 可以跟我說一下嗎??
    謝謝

    回覆刪除
    回覆
    1. 簡單的說 純背景 跟 有車子的背景 相減之後 重複的部分就會消失 ,
      最後留下的 就是不相同的部分 也就是車子了
      然後再對車子 跟雜訊做一些處理

      刪除
  4. 請問一下 我有些照片可以讀取 可是有些照片 會被中斷掉
    他會顯示出
    於0x75e5c42d的za.exe中發生未處理的例外狀況:Microsoft C++在記憶體位置
    0x0021e740,發生例外狀況: cv::Exception

    回覆刪除
    回覆
    1. 你 img1 跟 img2 大小一模一樣嗎 不一樣可能會發生錯誤

      刪除
  5. 請問加入讀取影片後 能夠做到背景相減 二值化並且不會延遲嗎?
    目前我讀取一個影片 要將影片的前景抓出來
    但是前景二值化的結果超級慢 大概一秒一張左右

    回覆刪除
    回覆
    1. 會延遲 這邊只是用最好理解的方式寫 二值化
      正確來說要使用 OpenCV內建的函式效能才會好
      另外可以用開多執行緒 來減少等待二值化塞車的情形

      刪除