【学习笔记】OpenCV+C++(一)

会有一股神秘感。 提交于 2020-02-08 05:23:23

22:38

加载图像 cv::imread

    功能是加载图像文件成为一个Mat对象,

    其中第一个参数表示图像文件名称

    第二个参数表示加载的图像是什么类型,支持常见的三个参数值

    IMREAD_UNCHANGED(<0)表示加载原图,不做任何改变

    IMREAD_GRAYSCALE(0)表示把原图作为灰度图像加载进来

    IMREAD_COLOR(>0)表示把原图作为RGB图像加载进来

    注意:OpenCV支持JPG、PNG、TIFF等常见格式图像文件加载

显示图像(cv::namedWindos与cv::imshow)

    namedWindos功能是创建一个OpenCV窗口,它是由OpenCV自动创建与释放,无需去销毁它,(注意:早期版本需要destroy销毁)

    常见用法namedWindow("Window Title",WINDOW_AUTOSIZE)

    WINDOW_AUTOSIZE会自动根据图像大小,显示窗口大小,不能人为改变窗口大小

    WINDOW_NORMAL跟QT集成的时候会使用,允许修改窗口大小

    imshow根据窗口名称显示图像到指定窗口去,第一个参数是窗口名称,第二个参数是Mat对象

修改图像 cv::cvtColor

    cvtColor的功能是把图像从一个彩色空间转换到另一个色彩空间,有三个参数,第一个参数表示源图像,第二个参数表示色彩空间转换后图像,第三个图像表示源和目标色彩空间如:COLOR_BGR2HLS、COLOR_BGR2GRAY等

    cvtColor(image,gray_image,COLOR_BGR2GRAY);

保存图像 cv::imwrite

    imwrite("路径名",图片名);

 

#include<opencv2/opencv.hpp>

#include<iostream>

#include<math.h>

using namespace cv;

int main(int argc,char** argv){

Mat src = imread("路径名");

if(src.empty()){

    printf("Could not load image...\n");

    return -1;

}

namedWindow("opencv setup demo",CV_WINDOW_AUTOSIZE);

imshow("opencv setup demo",src);

namedWindow("output windows",CV_WINDOW_AUTOSIZE);

Mat output_image;

cvtColor(src,output_image,CV_BGR2HLS);

imshow("output windows",output_image);

imwrite("路径名",output_image);

waitKey(0);

return 0;

}

获取图像像素指针

    CV_Assert(myImage.depth()==CV8U);

    Mat.ptr<uchar>(int i = 0)获取像素矩阵的指针,索引i表示第几行,从0开始计行数

    获得当前行指针const uchar* current = myImage.ptr<uchar>(row);

    获取当前像素点P(row,col)的像素值P(row,col)=current[col]

像素范围处理saturate_cast<uchar>

    saturate_cast<uchar>(-100),返回0.

    saturate_cast<uchar>(288),返回255

    saturate_cast<uchar>(100),返回100

    这个函数的功能是确保RGB值的范围在0~255之间

掩膜操作实现图像对比度调整

    红色是中心像素,从上到下,从左到右对每个像素做同样的处理操作,得到最终结果就是对比度提高之后的输出图像Mat对象

    矩阵掩膜操作十分简单,根据掩膜来重新计算每个像素的像素值,掩膜(mask也被称为Kernel)

    通过掩膜操作实现图像对比度提高。

    I(i,j)=5*I(i,j)-[I(i-1,j)+I(i+1,j)+I(i,j-1)+I(i,j+1)]

 0 -1 0

 -1 5 -1

 0 -1 0

 

#include<opencv2/opencv.hpp>

#include<iostream>

#include<math.h>

using namespace cv;

int main(int argc;char** argv){

Mat src,dst;

src = imread("");

if(!src.data){

    printf("Could not load image!");

    return -1;

}

namedWindow("input image",CV_WINDOW_AUTOSIZE);

imshow("input image",src);

//

int cols = (src.cols - 1) * src.channels();

int offsetx = src.channels();

int rows = src.rows;

dst = Mat::zeros(src.size(),src.type());

for(int row = 1; row < (rows - 1);row++){

    const uchar* current = src.ptr<uchar>(row);

    const uchar* previous = src.ptr<uchar>(row - 1);

    const uchar* next = src.ptr<uchar>(row + 1);

    uchar* output = dst.ptr<uchar>(row);

    for(int col = offsetx;col < cols;col++){

        output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col]));

    }

}

    namedWindow("output image",CV_WINDOW_AUTOSIZE);

    imshow("output image",dst);

   waitKey(0);

   return 0;

}

 

OpenCV自带函数实现以上功能

函数调用filter2D功能

    定义掩膜:Mat kernel = (Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);

    filter2D(src,dst,src.depth(),kernel);其中src与dst是Mat类型变量,src.depth()表示位图深度有32,24,8等。

    注意:depth()不知道可以直接写-1

 

代码片段:(衡量程序执行时间)

    Mat kernel = (Mat_<char>(3,3)<<0,-1,0,-1,5,-1,0,-1,0);

    double t = (double)getTickCount();

    filter2D(src,dst,src.depth(),kernel);

    double timeconsume = ((double)getTickCount() - 5)/getTickFrequency();

    cout<<"Built filter2D Time passes in seconds"<<timeconsume<<endl;

    imshow("output",dst);

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!