一、邂逅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;
}