因為來源是二值影像,所以這邊想到一個更簡潔,效果我覺得一定好的方式 (自我感覺良好: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);