Opencv学习

头文件介绍

导图Opencv学习_第1张图片

管理态对象内存、处理轮廓

OpenCV使用==Memory Storage== 来统一管理各种动态对象的内存

使用==sequence==处理轮廓,是Memory Storage中可存储的一种对象


XML\YAML文件打开

在OpenCV中的数据结构为FileStorage,打开操作例如:

string filename = "I.xml";
FileStorage fs(filename, FileStorage::WRITE);
\\...
fs.open(filename, FileStorage::READ);

直方图显示

void Histget(const Mat src)
{
    vector rgb_planes;
    split(src, rgb_planes);
    /// 设定bin数目
    int histSize = 255;
    vector  hsv_planes;
    /// 设定取值范围 ( R,G,B) )
    float range[] = { 0, 255 };
    const float* histRange = { range };

    bool uniform = true; bool accumulate = false;

    Mat r_hist, g_hist, b_hist;

    /// 计算直方图:
    calcHist(&rgb_planes[0], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate);
    calcHist(&rgb_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate);
    calcHist(&rgb_planes[2], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate);

    // 创建直方图画布
    int hist_w = 400; int hist_h = 400;
    int bin_w = cvRound((double)hist_w / histSize);

    Mat histImage(hist_w, hist_h, CV_8UC3, Scalar(0, 0, 0));

    /// 将直方图归一化到范围 [ 0, histImage.rows ]
    normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
    normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
    normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());

    /// 在直方图画布上画出直方图
    for (int i = 1; i < histSize; i++)
    {
        line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))),
            Point(bin_w*(i), hist_h - cvRound(r_hist.at<float>(i))),
            Scalar(0, 0, 255), 2, 8, 0);
        line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))),
            Point(bin_w*(i), hist_h - cvRound(g_hist.at<float>(i))),
            Scalar(0, 255, 0), 2, 8, 0);
        line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))),
            Point(bin_w*(i), hist_h - cvRound(b_hist.at<float>(i))),
            Scalar(255, 0, 0), 2, 8, 0);
    }

    /// 显示直方图
    namedWindow("calcHist Demo", CV_WINDOW_AUTOSIZE);
    imshow("calcHist Demo", histImage);
}

图像尺寸变换

  1. resize 常规方法
void resize(Mat inputImg,Mat outputImg,Size dsize,
    double fx,double fy,
    int interpolation=, CV_INTER_AREA);
//其中 dsize可以通过Size来定义
    // Size dsize=Size(Img.rows,Img.cols*2);
//fx,fy与dsize不能同时为0,
//interpolation控制新增像素
    //INTER_NEAREST - 最近邻插值
    //INTER_LINEAR - 线性插值(默认值)
    //INTER_AREA - 区域插值(利用像素区域关系的重采样插值)
    //INTER_CUBIC –三次样条插值(超过4×4像素邻域内的双三次插值)
    //INTER_LANCZOS4 -Lanczos插值(超过8×8像素邻域的Lanczos插值)

  1. 图像金字塔

分为pyrUp(向上采样)和pyrDown(向下采样),二者不互逆

void pyrUp(InputMat src, OutputMat dst, Size dsize,
int borderType=BORDER_DEFAULT )  


resize可以一次性将原图像变为任意不为0的尺寸,适合用来做归一化图像操作;而pyrDown与pyrUp适合做长宽比率不变得操作,且调用一次只能变为1/2或者2倍~~~

可以参考CSDN链接讲解


图像结构形状描述

void findContours();//得到轮廓区域的参数


Hough Transformation

  • 在二值图中快速准确得出直线和圆
    分为两种:
    1. 标准hough变换
    2. 统计hough变换

步骤:
1. 提取图像,并进行canny边缘提取
2. 进行灰度转换,再经过hough变换
3. 输出hough图像

vector lines;

Houghlines();
Houghcircles();



腐蚀、膨胀

  • 膨胀
    Opencv学习_第2张图片

  • 腐蚀
    Opencv学习_第3张图片

Mat element=getStructuringElement(MORPH_RECT, Size(5, 5));
//矩形: MORPH_RECT
//交叉形: MORPH_CROSS
//椭圆形: MORPH_ELLIPSE
void cv::dilate(src,src1,element);
void cv::erode(src,src1,element);

访问像素


例如产生随机椒盐噪声

i=std::rand()%img.cols; 
j=std::rand()%img.rows;
if (img.type()==CV_8UC1)
    img.at(I,j)=255;//二值图访问
else if (img.type()==CV_8UC3)
    Img.at<cv::vec3b>(I,j)[1]=255;//三通道图片访问
    Img.at<cv::vec3b>(I,j)[2]=255;
    Img.at<cv::vec3b>(I,j)[3]=255;



你可能感兴趣的:(Opencv)