026-opencv320 (总结)

【1】读入读片

imread

【2】

// 001-test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;

int main(void)
{
//--------------读入图像---------------
    Mat 读入的原始图 = imread("test.jpg");
//---------------显示图像-----------
    //imshow("读入的原始图.jpg",读入的原始图);
//---------------进行模糊------------
    Mat 模糊后的图;
    blur(读入的原始图,模糊后的图,Size(7,7));
    //imshow("模糊后的图",模糊后的图);
    //-----------将图片转为灰度-  
    //----------opencv 里第一个都是源 ,第二个是输出
    Mat 灰度图;
    //-----------转为灰度--------
    cvtColor(模糊后的图,灰度图,CV_BGR2GRAY);
    //imshow("灰度图",灰度图);
    //-----------降噪---------
    Mat 降噪后;
    blur(灰度图, 降噪后, Size(7, 7));
    //imshow("降噪后 ", 降噪后);
    //----------运行canny算子---、
    Canny(降噪后,降噪后,3,9,3);
    //imshow("边缘检测结果",降噪后);
    // ------------读取视频-------
    VideoCapture 读入视频;
    读入视频.open("test.mp4");
    while (1)
    {
        Mat 存储图像的每一帧;
        读入视频 >> 存储图像的每一帧;
        if (存储图像的每一帧.empty())
        {
            break;
        }

        //imshow("存储图像每一帧的显示", 存储图像的每一帧);
        waitKey(30);
    }

    //-----------调用摄像头采集图像------
    VideoCapture 捕获视频(0);
    while (1)
    {
        Mat 存储视频到图像;
        捕获视频 >> 存储视频到图像;
        Mat 存储视频图像变灰度图像;
        //imshow("存储视频到图像", 存储视频到图像);//显示当前图像 
        cvtColor(存储视频到图像, 存储视频图像变灰度图像, COLOR_BGR2GRAY);
        blur(存储视频图像变灰度图像, 存储视频图像变灰度图像,Size(50,50));
        Canny(存储视频图像变灰度图像, 存储视频图像变灰度图像,3,9,3);
        //imshow("存储视频图像变灰度图像", 存储视频图像变灰度图像);
        waitKey(30);

        

    }

    printf("\t 当前的版本 OpenCV  " CV_VERSION);//注意这里没有逗号哈
    Mat 读入 = imread("test.jpg");


    imwrite("test3.jpg", 读入);
    imwrite("test2.jpg",读入);

//----------读入图像--------
    Mat logo = imread("test2.jpg");
    Mat image = imread("test2.jpg");
    //-------logo重定义大小----
    resize(logo, logo,Size(100,100));
    imshow("logo_biaoxiao",logo);
    imshow("image", image);
    //----- 感兴趣区域-------
    Mat 图像感兴趣区域;
    //-------------------- ---(左上角,左上角+logo大小)
    图像感兴趣区域 = image(Range(100, 200),Range(100, 200));
    //------------------------权重       权重  
    addWeighted(图像感兴趣区域,0.5, logo,0.3,0., 图像感兴趣区域);
    imshow("读入", image);


    cvWaitKey(4000);
//---------------边缘检测--------


    return 0;
}

【3】鼠标点击画出特征点坐标并输出到文件,参考毛星云的书里的代码改的


#include <opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;

//-----------------------------------【宏定义部分】--------------------------------------------
//  描述:定义一些辅助宏 
//------------------------------------------------------------------------------------------------ 
#define 窗口名 "【程序窗口】"        //为窗口标题定义的宏 


//-----------------------------------【全局函数声明部分】------------------------------------
//        描述:全局函数的声明
//------------------------------------------------------------------------------------------------
void 鼠标回调函数(int event, int x, int y, int flags, void* param);
void 画矩形(cv::Mat& 窗口名字, cv::Rect box);


//-----------------------------------【全局变量声明部分】-----------------------------------
//        描述:全局变量的声明
//-----------------------------------------------------------------------------------------------
Rect 矩形;
bool 是否画矩形 = false;//是否进行绘制
RNG 随机数(12345);
ofstream OutFile("Test.txt");// //利用构造函数创建txt文本,并且打开该文本

//-----------------------------------【main( )函数】--------------------------------------------
//        描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-------------------------------------------------------------------------------------------------
int main(int argc, char** argv)
{

    //【1】准备参数
    矩形 = Rect(-1, -1, 0, 0);
    //Mat 读取的原图(600, 800, CV_8UC3), 临时图像;
    Mat 读取的原图 = imread("test.jpg"), 临时图像;
    读取的原图.copyTo(临时图像);

    //读取的原图 = Scalar::all(0);

    //【2】设置鼠标操作回调函数
    namedWindow(窗口名);
    //类似中断函数
    setMouseCallback(窗口名, 鼠标回调函数, (void*)& 读取的原图);

    //【3】程序主循环,当进行绘制的标识符为真时,进行绘制
    while (1)
    {
        printf("在死循环里");
        读取的原图.copyTo(临时图像);//拷贝源图到临时变量
        if (是否画矩形) 
            画矩形(临时图像, 矩形);//当进行绘制的标识符为真,则进行绘制
        imshow(窗口名, 临时图像);
        if (waitKey(10) == 27) break;//按下ESC键,程序退出
    }
    OutFile.close();//            //关闭Test.txt文件
    return 0;
}

//--------------------------------【鼠标回调函数( )函数】-----------------------------
//        描述:鼠标回调函数,根据不同的鼠标事件进行不同的操作
//-----------------------------------------------------------------------------------------------
void 鼠标回调函数(int event, int x, int y, int flags, void* param)
{

    char 坐标点[16];
    Mat& image = *(cv::Mat*) param;
    switch (event)
    {
        //鼠标移动消息
    case EVENT_MOUSEMOVE:
    {
        if (是否画矩形)//如果是否进行绘制的标识符为真,则记录下长和宽到RECT型变量中
        {
            矩形.width = x - 矩形.x;
            矩形.height = y - 矩形.y;
            printf("进鼠标回调事件了");

            printf("进鼠标回调事件了");
        }

    }
    break;

    //左键按下消息
    case EVENT_LBUTTONDOWN:
    {
        是否画矩形 = true;
        矩形 = Rect(x, y, 0, 0);//记录起始点
        sprintf(坐标点, "l p(%d,%d)", x, y);
        putText(image, 坐标点, Point(x, y), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0, 255));
        OutFile << 坐标点;//  //把字符串内容"This is a Test!",写入Test.txt文件
        printf("进鼠标回调事件了");
    }
    break;

    //左键抬起消息
    case EVENT_LBUTTONUP:

    {
        printf("进鼠标回调事件了");
        是否画矩形 = false;//置标识符为false
        //对宽和高小于0的处理
        if (矩形.width < 0)
        {
            矩形.x += 矩形.width;
            矩形.width *= -1;
        }

        if (矩形.height < 0)
        {
            矩形.y += 矩形.height;
            矩形.height *= -1;
        }
        //调用函数进行绘制
        画矩形(image, 矩形);
        sprintf(坐标点, "(%d,%d)", x, y);
        putText(image, 坐标点, Point(x, y), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0, 255));
        sprintf(坐标点, "w h(%d,%d)", 矩形.width, 矩形.height);
        putText(image, 坐标点, Point(x+20, y+20), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0, 255));
        OutFile << ";"<<坐标点<<endl;//  //把字符串内容"This is a Test!",写入Test.txt文件
    }
    break;

    }
}

//-----------------------------------【画矩形( )函数】------------------------------
//        描述:自定义的矩形绘制函数
//-----------------------------------------------------------------------------------------------
void 画矩形(cv::Mat & 窗口名字, cv::Rect box)
{
    cv::rectangle(窗口名字, box.tl(), box.br(), cv::Scalar(随机数.uniform(0, 255), 随机数.uniform(0, 255), 随机数.uniform(0, 255)));//随机颜色
}

 

【4】基础图像容器Mat (类)    

(1)像素值得存储:RGB   HSV   YCRCB  CIE

(2) 显示穿件的Mat :

   Mat M (2,2,CV_8UC3,Scalar(0,0,255));

  cout<<M;

(3) Point 类

    //-----定义别名------
    typedef Point_<float> Point2f;
    Point2f s(2, 2);
    //------也可以直接定义----
    Point dian = Point(2,2);

【5】颜色空间转换

    Mat 图像 = imread("test.jpg"),图像后;

    cvtColor(图像,图像后,COLOR_BGR2Lab);
    imshow("图像后来",图像后);

【5】绘图


    //--------rect类-----------左上角 宽 高
    //--------cvtColor----颜色空间转换,可以实现RGB HSV  HSI 等颜色空间的转换
    Mat 图像 = imread("test.jpg"),图像后;
    // line   ellipse   rectangle 矩形  circle 圆     fillpoly 填充多边形

【6】像素访问
    //-----column0--column1-------访问像素---BGR-----------
    //-row0------------
    //-row1------------
    //-row3------------

【7】计时函数

    //------------计时函数----------------
    double time0 = static_cast<double>(getTickCount());
    time0 = ((double)getTickCount()-time0)/getTickFrequency();
    cout << time0;

 

【8】像素的访问方法

(1) 指针 .ptr  (2) 迭代器   iterator (3)  动态地址 配合 at 

void colorReduce(Mat& inputImage, Mat& outputImage, int div)  
{  
    //参数准备
    outputImage = inputImage.clone();  //拷贝实参到临时变量
    int rowNumber = outputImage.rows;  //行数
    int colNumber = outputImage.cols;  //列数

    //存取彩色图像像素
    for(int i = 0;i < rowNumber;i++)  
    {  
        for(int j = 0;j < colNumber;j++)  
        {      
            // ------------------------【开始处理每个像素】--------------------
            outputImage.at<Vec3b>(i,j)[0] =  outputImage.at<Vec3b>(i,j)[0]/div*div + div/2;  //蓝色通道
            outputImage.at<Vec3b>(i,j)[1] =  outputImage.at<Vec3b>(i,j)[1]/div*div + div/2;  //绿色通道
            outputImage.at<Vec3b>(i,j)[2] =  outputImage.at<Vec3b>(i,j)[2]/div*div + div/2;  //红是通道
            // -------------------------【处理结束】----------------------------
        }  // 行处理结束     
    }  
}  

 

【9】颜色空间缩减函数   colorReduce

【10】感兴趣区域ROI

        Mat outputImage=imread("test.jpg");;

        Mat logo = imread("test4.jpg");
        Mat imageROI;
        imageROI = outputImage(Rect(10,10,logo.cols,logo.rows));
        addWeighted(imageROI,0.5, logo,0.3,0.0, imageROI);
        imshow("outputImage",outputImage);

 

【11】 融合函数 addWeighted(感兴趣区域,权重,logo,权重,标值量,感兴趣区域,输出阵列深度)

【12】 通道分离函数 split()

src=imread("test.jpg");

split(src,channels);

imageBlueChannel=channels.at(0);

imageGreenChannel=channels.at(1);

imageRedChannel=channels.at(2);

【13】合并

merge

【14】

g(x)=a*f(x)+b

对比度 contrast ,上式里的a

亮度 brightness ,上式里的b

 

 

颜色校正 colorcorrection

【14】傅里叶变换----分解成正弦和余弦,也就是将图像从空间域转换到频域。

高频代表细节,低频代表轮廓。

e^ix=cos x+i sin x

【15】xml(可扩展标识语言) 和yaml (厉害一些)

通过 FileStorage 读取

【16】方框滤波  BoxBlur

均值滤波  Blur

高斯滤波 GaussianBlur

中值滤波  medianBlur

双边滤波  bilateraFilter 

(2) 形态学滤波腐蚀(dilate)和膨胀 (erode),形态学梯度(morphological gradient )膨胀和腐蚀之差

顶帽

黑帽

 【17】漫水填充

FloodFill

【18】图像金字塔(就是放大和缩小  pyrUp(),pyrDown()或者resize())

【19】 固定阈yu值和自适应阈值   Threshold        AdaptThreshold

【20】边缘检测     滤波---增强----检测

canny:低错误率

sobel:用来计算灰度图像的近似梯度

Laplacian算子:

【21】霍尔基夫变换: 寻找直线

【22】重映射 ,remap

仿射变换:warpAffine 和getRotationMatrix2D----平行变换  (旋转,平移,缩放)

【23】直方图均衡化:

equalizeHist()函数

【24】查找轮廓

findContours()

【25】寻找凸包

convexHull()

(1)返回外部矩形的边界  boundingRect()

(2)寻找最小保卫矩形 minAreaRect()

(3)寻找最小包围圆形 minEnclosingCircle() 

(4)用椭圆拟合二维点集 fitEIIipse()

(5)逼近多边形曲线 approxPolyDP()

(6)计算轮廓面积 contourArea()

(7)集散轮廓长度 arcLength()

 

【26】分水岭算法----可用于图像分割,边缘山脉,均匀区域转为山谷,有助于分割目标。

watershed()函数

【27】图像修补函数

 inpaint()函数

【28】直方图

通过标记帧与帧之间显著的边缘和颜色的统计变换,检测食品中场景的变化。

边缘、色彩、角度等直方图构成了可以被传递给目标识别分类器的通用特征类型。

直条: 可以是梯度,方向,色彩或任何其他特征。

(1)计算直方图   calcHIST()函数

(2)寻找最值 minMaxLoc()

(3) H-S色调饱和度直方图

(4)对比直方图 campareHist() 函数

【29】反向投影: 记录给定图像中的像素点如何适应直方图模型像素分布方式的一种方法。

-----------首先计算某一特征的直方图模型,然后使用模型去寻找途中存在的该特征的方法。

计算 反向投影函数, calcBackProject()函数

【30】模板匹配    matchTemplate(待搜索图像,搜索末班,比较结果的映射图,匹配方法)

【31】角点检测

兴趣点=关键点=特征点   分为三种  边缘、角点、斑点

harris 角点检测----函数  cornerHarris() 函数

(2)确定图像强角点   goodFeatureToTrack() 函数

(3)亚像素角点检测  cornerSubPix()函数

【32】特征匹配

特征检测和特征点匹配是计算机视觉中重要的技术之一。

在物体检测,视觉跟踪,三维重建有这广泛应用。

常用的特征检测方法:

FAST

STAR

SIFT

SURF

ORB

MSER

GFTT

HARRIS

Dense

SimpleBlob

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值