您的位置:首页 > 其它

背景建模技术(七):预处理(PreProcessor)模块

2015-05-16 10:59 483 查看
预处理(PreProcessor)模块是BgsLibrary中一个必选的模块,是真正进入背景建模算法的“预处理”过程,其主要功能包括‘去模糊’、‘获得灰度图’、'应用Canny算子‘等可选模块。

下面给出源码:

#include "PreProcessor.h"

namespace bgslibrary
{
PreProcessor::PreProcessor() : firstTime(true), equalizeHist(false), gaussianBlur(false)
{
std::cout << "PreProcessor()" << std::endl;
}

PreProcessor::~PreProcessor()
{
std::cout << "~PreProcessor()" << std::endl;
}

void PreProcessor::setEqualizeHist(bool value)
{
equalizeHist = value;
}

void PreProcessor::setGaussianBlur(bool value)
{
gaussianBlur = value;
}

cv::Mat PreProcessor::getGrayScale()
{
return img_gray.clone();
}

void PreProcessor::process(const cv::Mat &img_input, cv::Mat &img_output)
{
if (img_input.empty())
return;

loadConfig();

if (firstTime)
saveConfig();

img_input.copyTo(img_output);

// Converts image from one color space to another
// http://opencv.willowgarage.com/documentation/cpp/miscellaneous_image_transformations.html#cv-cvtcolor cv::cvtColor(img_input, img_gray, CV_BGR2GRAY);
//img_gray.copyTo(img_output);

// Equalizes the histogram of a grayscale image
// http://opencv.willowgarage.com/documentation/cpp/histograms.html#cv-equalizehist if (equalizeHist)
cv::equalizeHist(img_output, img_output);

// Smoothes image using a Gaussian filter
// http://opencv.willowgarage.com/documentation/cpp/imgproc_image_filtering.html#GaussianBlur if (gaussianBlur)
cv::GaussianBlur(img_output, img_output, cv::Size(7, 7), 1.5);

if (enableShow)
cv::imshow("Pre Processor", img_output);

firstTime = false;
}

void PreProcessor::rotate(const cv::Mat &img_input, cv::Mat &img_output, float angle)
{
IplImage* image = new IplImage(img_input);

//IplImage *rotatedImage = cvCreateImage(cvSize(480,320), IPL_DEPTH_8U, image->nChannels);
//IplImage *rotatedImage = cvCreateImage(cvSize(image->width,image->height), IPL_DEPTH_8U, image->nChannels);
IplImage* rotatedImage = cvCreateImage(cvSize(image->height, image->width), IPL_DEPTH_8U, image->nChannels);

CvPoint2D32f center;
//center.x = 160;
//center.y = 160;
center.x = (image->height / 2);
center.y = (image->width / 2);

CvMat* mapMatrix = cvCreateMat(2, 3, CV_32FC1);

cv2DRotationMatrix(center, angle, 1.0, mapMatrix);
cvWarpAffine(image, rotatedImage, mapMatrix, CV_INTER_LINEAR + CV_WARP_FILL_OUTLIERS, cvScalarAll(0));

cv::Mat img_rot(rotatedImage);
img_rot.copyTo(img_output);

cvReleaseImage(&image);
cvReleaseImage(&rotatedImage);
cvReleaseMat(&mapMatrix);
}

void PreProcessor::applyCanny(const cv::Mat &img_input, cv::Mat &img_output)
{
if (img_input.empty())
return;

//------------------------------------------------------------------
// Canny
// Finds edges in an image using Canny algorithm.
// http://opencv.willowgarage.com/documentation/cpp/imgproc_feature_detection.html#cv-canny //------------------------------------------------------------------

cv::Mat img_canny;
cv::Canny(
img_input, // image ?Single-channel 8-bit input image
img_canny,  // edges ?The output edge map. It will have the same size and the same type as image
100,       // threshold1 ?The first threshold for the hysteresis procedure
200);      // threshold2 ?The second threshold for the hysteresis procedure
cv::threshold(img_canny, img_canny, 128, 255, cv::THRESH_BINARY_INV);

img_canny.copyTo(img_output);
}

void PreProcessor::saveConfig()
{
CvFileStorage* fs = cvOpenFileStorage("./config/PreProcessor.xml", 0, CV_STORAGE_WRITE);

cvWriteInt(fs, "equalizeHist", equalizeHist);
cvWriteInt(fs, "gaussianBlur", gaussianBlur);
cvWriteInt(fs, "enableShow", enableShow);

cvReleaseFileStorage(&fs);
}

void PreProcessor::loadConfig()
{
CvFileStorage* fs = cvOpenFileStorage("./config/PreProcessor.xml", 0, CV_STORAGE_READ);

equalizeHist = cvReadIntByName(fs, 0, "equalizeHist", false);
gaussianBlur = cvReadIntByName(fs, 0, "gaussianBlur", false);
enableShow = cvReadIntByName(fs, 0, "enableShow", true);

cvReleaseFileStorage(&fs);
}
}


最后给出此模块的流程框架图供大家参考:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐