OpenCV简介
OpenCV是一个开源的跨平台计算机视觉库,它实现了图像处理和计算机视觉方面的很多通用算法。
应用场景:
目标识别:人脸、车辆、车牌、动物;
自动驾驶;医学影像分析;
视频内容理解分析:文字识别、公众人物识别、识别各类物品
OpenCV图像模式
位图模式
位图模式就是1位二进制深度的图像模式,只有黑白两种颜色。它可以由扫描或置入黑色的矢量线条图像生成,也只能由灰度模式转换而来。
灰度模式
灰度模式是8位二进制深度的图像模式,在全黑和全白间插有254个灰度等级的颜色来描绘灰度模式的图像,所有模式的图像都能转换成灰度模式。
RGB模式
简而言之就是彩色。
新建项目
进入Qt新建一个项目,打开.pro文件,添加以下代码
INCLUDEPATH +=/usr/local/include/
LIBS+=/usr/local/lib/libopencv_world.so
引入头文件和域
#include <opencv2/opencv.hpp>
using namespace cv;
加载图像
示例
我们来使用OpenCV来实现加载一张图片
Mat img=imread("image/dog.jpg");
imshow("img",img); // 显示图片
waitKey(0); // 等待用户操作
Mat类似于一个图片信息的类。
imread("path")读取图片信息,path为路径。
imshow()显示图片。
waitKey(0)类似于一个死循环等待用户操作,如果我们写waitKey(1000)就等待1s就消失,当然waitKey的话只要接收到键盘输入值就消失。
结果
处理图像像素点
示例
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Mat image_process(Mat &img){
int row=img.rows; // 获取行
int col=img.cols * img.channels(); // 获取列
// 改变图片像素点
for(int i=0;i<row;i++){
// 获取第i行地址
uchar* data=img.ptr<uchar>(i);
for(int j=0;j<col;j++){
/*int q=rand()%col;
data[q]=155;*/
data[j]-=70;
}
}
return img;
}
int main()
{
// 读取图片信息
// Mat:图片信息的类
Mat img=imread("image/dog.jpg",IMREAD_GRAYSCALE);
image_process(img);
imshow("img",img);
while(1){
int key=waitKey(0); // 等待用户操作
if(key==10)
break;
}
return 0;
}
结果
简易毛玻璃特效
示例
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
// 毛玻璃特效
Mat img_glass(Mat &img)
{
RNG rng;
int random=0;
for(int i=0;i<img.rows;i++)
{
for(int j=0;j<img.cols-5;j++)
{
random=rng.uniform(0,5);
// at<>访问Mat数据域(BGR)
img.at<Vec3b>(i,j)[0]=img.at<Vec3b>(i+random,j+random)[0]; // B
img.at<Vec3b>(i,j)[1]=img.at<Vec3b>(i+random,j+random)[1]; // G
img.at<Vec3b>(i,j)[2]=img.at<Vec3b>(i+random,j+random)[2]; // R
}
}
return img;
}
int main()
{
// 读取图片信息
// Mat:图片信息的类
Mat img=imread("image/dog.jpg");
img_glass(img);
imshow("img",img);
while(1){
int key=waitKey(0); // 等待用户操作
if(key==10)
break;
}
return 0;
}
结果
读取视频
示例
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat frame;
VideoCapture cap("video/carMove.mp4");
while(cap.read(frame))
{
imshow("video",frame);
waitKey(40);
}
return 0;
}