在這個範例中,會使用到下面這兩個函數
cvFindContours 和 cvDrawContours
以及這兩個變數型態
以上知識都了解後,就可以開始來實作了!
這次使用到的範例圖片是下面這張(用小畫家很隨意地畫了...)
命名為Test.png,並放置在D:\
開始撰寫程式碼!
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
char fileName[] = "D:\\Test.png";//注意是png檔!上面範例圖片空白的地方其實是去背了
IplImage *input, *output;//輸入和輸出的圖片
CvMemStorage *storage;//儲存掃描到的輪廓
CvSeq *seq = NULL;//儲存到的輪廓所在的位置
input = cvLoadImage(fileName, CV_LOAD_IMAGE_GRAYSCALE);//載入圖片並轉為灰階
if (!input)
cout << "找不到圖片!!!" << endl;
else
{
//初始化
storage = cvCreateMemStorage();
output = cvCreateImage(cvGetSize(input), IPL_DEPTH_8U, 4);
cvThreshold(input, input, 200, 255, CV_THRESH_BINARY);//二值化
cvFindContours(input, storage, &seq, sizeof(CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));//尋找輪廓
cvDrawContours(output, seq, CV_RGB(255, 0, 0), CV_RGB(0, 0, 255), 2, 3);//畫出輪廓圖
cvShowImage("output", output);
cvWaitKey(0);
//關閉視窗,釋放記憶體
cvDestroyWindow("output");
}
system("pause");
return 0;
}
執行結果如下
還有另一種輪廓檢測的方式,不過由於檢測出來的圖形很...粗曠(難看),有興趣的可以看下面這篇文章
留言列表