Opencv学习

    xiaoxiao2021-03-31  32

    头文件介绍

    导图

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

    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<Mat> rgb_planes; split(src, rgb_planes); /// 设定bin数目 int histSize = 255; vector<Mat> 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); }

    图像尺寸变换

    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插值)
    图像金字塔

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

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

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

    可以参考链接讲解


    图像结构形状描述

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

    Hough Transformation

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

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

    vector<Vec2f> lines; Houghlines(); Houghcircles();

    腐蚀、膨胀

    膨胀

    腐蚀

    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<uchar>(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;
    转载请注明原文地址: https://ju.6miu.com/read-665388.html

    最新回复(0)