Opencv(c++)基础
1、加载、显示图像、修改图像、保存图像
加载图像cv::imread(其中第一个参数表示图像文件名称第二个参数,表示加载的图像是什么类型,支持常见的三个参数值MREAD_UNCHANGED (<0) 表示加载原图,不做任何改变IMREAD_GRAYSCALE ( 0)表示把原图作为灰度图像加载进来IMREAD_COLOR (>0) 表示把原图作为RGB图像加载进来)
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
//读取图片(使用图片的绝对路径)
Mat src = imread("path",IMREAD_GRAYSCALE);
if (src.empty()) {
printf("could not find the image!\n");
return -1;
}
imshow("ImputImage", src);
//不加此语句图片会一闪而过
waitKey(0);
system("path");
getchar();
return 0;
}
显示图像cv::namedWindows+cv::imshow
(常见用法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(保存图像文件到指定目录路径只有8位、16位的PNG、JPG、Tiff文件格式而且是单通道或者三通道的BGR的图像才可以通过这种方式保存)
2、矩阵的掩膜操作
什么是掩膜操作
掩膜操作可以实现对图像对比度的计算调整
矩阵的掩膜操作是很据掩膜来计算每个像素的像素值,掩膜(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)]
通过公式可知,如果选择的这个中心点比周围的点暗,那就让它更暗,同理,如果比周围亮,那就让它更亮。当把这个操作扩展到整个图像之后,图像之间的亮暗差距会变得更大,也就是对比度会更大。又因为一个图像的边缘点没有四周进行对比,不能使用公式,所以在写程序时,循环变量即图像的行数和列数要从 1 开始,去掉最外圈像素没有办法进行比较的点。
Ps:int cols = image.cols * image.channels();注意图像通道数矩阵是列×通道数
实现掩膜的方法
①、使用遍历循环手写中心像素的值
②、filter2D语句
cv::Mat mask = (cv::Mat_(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 等。若 src.depth() 赋值为 -1 时,意味着图像深度与原图一致。
#include <opencv.hpp>
#include <iostream>
int main(int argc, char** argv)
{
cv::String imageName = "HappyFish.jpg";
if (argc > 1)
imageName = argv[1];
cv::Mat image = cv::imread(cv::samples::findFile(imageName), cv::IMREAD_COLOR);
cv::namedWindow("Display", cv::WINDOW_AUTOSIZE)
if (image.empty())
{
std::cout << "No image" << std::endl;
return -1;
}
cv::imshow("Display", image);
cv::Mat dst;
cv::Mat mask = (cv::Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cv::filter2D(image, dst, image.depth(), mask);
cv::namedWindow("Transform", cv::WINDOW_AUTOSIZE);
imshow("Transform", dst);
cv::waitKey(0);
return 0;
}
3、Mat对象
Mat对象与Ipllmage对象(IplImage 可以转换为 Mat)
Mat对象OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分了两个部分,头部与数据部分
IplImage是从2001年OpenCV发布之后就一直存在,是C语言风格的数据结构,需要开发者自己分配与管理内存,对大的程序使用它容易导致内存泄漏问题(现在一般不用)
其他很多用发参考:
Opencv_Mat类详解和用法