OpenCV進階

一、邂逅OpenCV

1.OpenCV2到OpenCV3的錯誤

添加頭文件“#include <cv.h>”,可以輕鬆讓OpenCV3認識舊版本的宏定義的前綴“CV_”

2.debug 下可以運行,release下不可以運行

eg:因爲字符串讀取問題引起的諸如圖片加載不了、指針越界、內存錯誤

簡單粗暴的方法:

把debug和release下的 .lib 依賴庫 都添加進去  =+=

3.簡單Demo

圖像腐蝕(erode)
 

#include <opencv2/highui/highui.hpp>    //OpenCV highgui模塊頭文件
#include <opencv2/imgroc/imgroc.hpp>  //OpenCV圖像處理頭文件

using namespace cv;              //包含cv命名空間
int main()
{ 
  //載入原圖
  Mat srcImage = imread("1.jpg");
  //顯示原圖
  imshow("【原圖】腐蝕操作" , srcImage);

  //進行腐蝕操作
  Mat element = getStrucingElement(MORPH_RECT,Size(15,15));
  Mat dstImage;
  erode(srcImage,dstImage,element);

  //顯示效果圖
  imshow("【效果圖】腐蝕操作",dstImage);

  waitKey(0);
  return 0;

}

圖像模糊(均值濾波操作blur)

blur(srcImage,dstImage,Size(7,7));

邊緣檢測Canny算子

 

載入圖像,並將其轉成灰度圖,再用blur函數進行圖像模糊以降噪,然後用canny函數進行邊緣檢測,最後進行顯示。

#include <opencv2/highui/highui.hpp>    //OpenCV highgui模塊頭文件
#include <opencv2/imgroc/imgroc.hpp>  //OpenCV圖像處理頭文件

using namespace cv;              //包含cv命名空間
int main()
{ 

  Mat srcImage = imread("1.jpg");
  imshow("【原圖】邊緣檢測" , srcImage);
  Mat edge,grayImage;

  //【1】將原始圖轉換爲灰度圖像
  cvtColor(srcImage,grayImage,cv_BGR2RAY);
  
  //【2】先用3X3內核來降噪
  blur(grayImage,edge,Size(3,3));
  
  //【3】運行sunny算子
  Canny(edge,edge,3,9,3);
  
  //【4】顯示效果圖
  imshow("【效果圖】腐蝕操作",dstImage);

  waitKey(0);
  return 0;

}

4.視頻操作

4.1讀取視頻

首先,先定義一個Mat變量,用於存儲每一幀的圖像,接着讀取當前幀到Mat變量中,然後調用imshow顯示當前的這一幀圖像,並用waitKey延遲30毫秒,開始下一次循環。

#include <opencv2/opencv.hpp>
using namespace cv;


int main()
{ 

  //【1】讀入視頻
  VedioCapture capture("1.avi");

  //【2】循環顯示每一幀
  while(1)
  {
     Mat frame;  //定義一個變量Mat,用於存儲每一幀圖像
     capture>>frame; //讀取當前幀

    //若視頻播放完成,退出循環
    if(frame.empty())
    { 
       break;
    }

    imshow("【讀取視頻】,frame"); //顯示當前幀
    waitKey(30);
  }
  
  return 0;

}

4.2調用攝像頭

#include <opencv2/opencv.hpp>
using namespace cv;


int main()
{ 

  //【1】從攝像頭讀入視頻
  VedioCapture capture(0); //參數設爲0  表示調用攝像頭

  //【2】循環顯示每一幀
  while(1)
  {
     Mat frame;  //定義一個變量Mat,用於存儲每一幀圖像
     capture>>frame; //讀取當前幀

     imshow("【讀取視頻】,frame"); //顯示當前幀
     waitKey(30);  //延遲30ms
  }
  
  return 0;

}

下面,通過調用攝像頭來配合canny邊緣檢測,得到canny邊緣檢測並高斯模糊後的攝像頭採集視頻

#include <opencv2/opencv.hpp>
using namespace cv;


int main()
{ 

  //從攝像頭讀入視頻
  VedioCapture capture(0); //參數設爲0  表示調用攝像頭
  Mat edges;

  //循環顯示每一幀
  while(1)
  {
     //【1】讀入圖像
     Mat frame;  //定義一個變量Mat,用於存儲每一幀圖像
     capture>>frame; //讀取當前幀

     //【2】將原圖像轉換爲灰度圖像
     cvtColor(frame,edges,COLOR_BGR2GRAY);//轉化BRG彩色圖爲灰度圖

     //【3】使用3X3內核降噪(2X3+1 = 7)
     blur(edges,edges,Size(7,7));

     //【4】進行canny邊緣檢測並顯示
     Canny(edges,edges,0,30,3);
     imshow("【被Canny後的視頻】",edges); //顯示當前幀
     if( waitKey(30) >= 0) break;  //延遲30ms
  }
  
  return 0;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章