場景
單純使用二值化函數處理圖像,嘗試擷取前景的物體,存在如下的限制條件
1 前景和背景顔色有着鮮明的差別,可以通過二值化函數的閥值來調整
環境
目前在進行車輛的邊緣檢測的過程中,道路和車輛連在一起,灰階化之後,進行二值化圖像,其實如果能夠擷取道路的原始圖檔,進行差分,應該是能夠非常輕松的提取車輛的輪廓的,不管如何進行閥值的調整,是以嘗試使用Candy算子進行邊緣的檢測
代碼
//圖像的二值化
//By MoreWindows (http://blog.csdn.net/MoreWindows)
#include <opencv2/opencv.hpp>
using namespace std;
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
IplImage *g_pGrayImage = NULL;
IplImage *g_pBinaryImage = NULL;
const char *pstrWindowsBinaryTitle = "二值圖";
void on_trackbar(int pos)
{
// 轉為二值圖
cvThreshold(g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY);
// 顯示二值圖
cvShowImage(pstrWindowsBinaryTitle, g_pBinaryImage);
}
int main( int argc, char** argv )
const char *pstrWindowsSrcTitle = "原圖";
const char *pstrWindowsToolBarName = "二值圖門檻值";
// 從檔案中加載原圖
IplImage *pSrcImage = cvLoadImage("D:/20170601092226.png", CV_LOAD_IMAGE_UNCHANGED);
// 轉為灰階圖
g_pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);
// 建立二值圖
g_pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);
// 顯示原圖
cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsSrcTitle, pSrcImage);
// 建立二值圖視窗
cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE);
// 滑動條
int nThreshold = 0;
cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar);
on_trackbar(1);
cvWaitKey(0);
cvDestroyWindow(pstrWindowsSrcTitle);
cvDestroyWindow(pstrWindowsBinaryTitle);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&g_pGrayImage);
cvReleaseImage(&g_pBinaryImage);
return 0;
參考
http://blog.csdn.net/morewindows/article/details/8239678
本文轉自fengyuzaitu 51CTO部落格,原文連結:http://blog.51cto.com/fengyuzaitu/1738474,如需轉載請自行聯系原作者