
因為來源是二值影像,所以這邊想到一個更簡潔,效果我覺得一定好的方式 (自我感覺良好:P),整個過程分三步驟:
- 對影像做水平掃描,若像素 A 的左或右為背景,則像素 A 為邊緣。
- 對影像做垂直掃描,若像素 A 的上或下為背景,則像素 A 為邊緣。
- 將步驟一得到的水平影像和步驟二的垂直影像做「logical OR operation」。
程式碼下載 (DFS is non-recursive version)



IplImage* iplImg = cvLoadImage("lena.jpg");
cv::Mat cvMatImg(iplImg, 0);
cv::imshow("cv::Mat Show", cvMatImg);
IplImage iplImg2;
iplImg2= IplImage(cvMatImg);
cvShowImage("IplImage2 Show", &iplImg2);
在第一個範例中,我們可以看到 cv::Mat 的建構子有兩個參數,比較重要的是第二個參數,如果設定成 0,代表不複製影像,也就是兩個變數的 row data 共用同個記憶體位置,header 則各自有。inline Mat::operator IplImage() const
{
IplImage img;
cvInitImageHeader(&img, size(), cvIplDepth(flags), channels());
cvSetData(&img, data, (int)step);
return img;
}
bool BrokenLineGraph(IplImage *blImg, int *data, int *range, int dataNum, bool reset);
bool HistogramGraph(IplImage *hgImg, int *data, int *range, int dataNum, bool reset, CvRNG *rng);