场景

    单纯使用二值化函数处理图像,尝试获取前景的物体,存在如下的限制条件

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 *pstrWindow***cTitle = "原图";

  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(pstrWindow***cTitle, CV_WINDOW_AUTOSIZE);

  cvShowImage(pstrWindow***cTitle, pSrcImage);

  // 创建二值图窗口

  cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE);


  // 滑动条

  int nThreshold = 0;

  cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar);


  on_trackbar(1);


  cvWaitKey(0);


  cvDestroyWindow(pstrWindow***cTitle);

  cvDestroyWindow(pstrWindowsBinaryTitle);

  cvReleaseImage(&pSrcImage);

  cvReleaseImage(&g_pGrayImage);

  cvReleaseImage(&g_pBinaryImage);

  return 0;

}



参考

http://blog.csdn.net/morewindows/article/details/8239678