《学习opencv3》
第一单元
显示图片
头文件 #include<opencv2/opencv.hpp>
Mat img=imread("路径"); //mat创建的是一个矩阵来存储图像
if(img.empty())return -1;
namedWindow("Example1",WINDOW_AUTOSIZE); //创建一个而窗口名字叫做 Example1
imshow("Example1",img); //选择一个窗口来输出img图片
waitKey(0); //一直等待用户按下一个键后才销毁窗口
转化为灰度图
下面展示一些 内联代码片
。
用img1.create(img.rows,img.cols,CV_8UC1)创建一个单通道图片
8代表每一个像素点占用的空间大小(8bits)u代表unsigned int类型 c1代表通道数为1
Vec3b intensity=img.at<Vec3b>(row,col); vec3b适用于表示8u类型的bgr值
Mat img1;
img1.create(img.rows,img.cols,CV_8UC1);
for(int row=0;row<img1.rows;row++){
for(int col=0;col<img1.cols;col++){
Vec3b intensity=img.at<Vec3b>(row,col); //存取图像中对应(x,y)的坐标
uchar blue=intensity[0];
uchar green=intensity[1];
uchar red=intensity[2];
*img1.ptr(row,col)=(red*28+green*151+blue*77)>>8;//灰度的计算公式 浮点运算麻烦,放大用移位运算
}
}
播放视频
VideoCapture g_cap 来创建容乃视频的对象
用 g_cap.open(……)来打开文件
g_cap>>frame 来一帧一帧输入然后投放到namewindow里面
int g_slider_position=0; //存储滑动条位置
int g_run=1; //为正的时候,表示程序停止前播放多少张图片 为负的时候,表示处于连续视频播放模式
int g_dontest=0; //避免调整进度条的时候触发单步模式
VideoCapture g_cap; //帧读取
int current_pos=0; //记录滑动条的位置
int space_Count=0; //用于纪录按下空格键的次数
/*
该函数为用户调整滑动条时执行的回调函数
在新位置调用该函数,使进度条移到我们希望的位置
*/
void onTrackbarSlide(int pos,void*){
g_cap.set(CAP_PROP_POS_FRAMES,pos); //在新位置调用该函数,使进度条移到我们希望的位置
if(!g_dontest) //只有用户修改滑动条时,才进入循环,视频进入单步模式
g_run=1;
g_dontest=0;
}
int main()
{
namedWindow("Example2_4",WINDOW_AUTOSIZE);
g_cap.open("D:/QT Projects/Player/falseGod.mp4");
int frames=(int)g_cap.get(CAP_PROP_FRAME_COUNT); //获取总帧数
createTrackbar("Position","Example2_4",&g_slider_position, //Position是给滑动条的一个标签 Example2_4表示在那个窗口放置滑动条
frames,onTrackbarSlide); // g_slider_position表示滑动条的位置,frames表示滑动条最大值(总帧数), onTrackbarSlide是移动滑动条时的回调函数
Mat frame; //创建一个mat类来存储每一帧的图片
while (1) { //死循环
if(g_run!=0){
g_cap>>frame; //向frame输入当前帧的图片
if(frame.empty())break; //读取图片失败 或者视频播放完 跳出循环
current_pos=(int)g_cap.get(CAP_PROP_POS_FRAMES); //保持下一帧的位置
g_dontest=1; //保证不进入单步模式
setTrackbarPos("Position","Example2_4",current_pos); //更新滑动条位置
imshow("Example2_4",frame); //展示frame里的图片
g_run-=1; //连续保持单步模式 或者依旧正常播放
}
char c=(char)waitKey(10);
if(c=='a'){ //如果在播放期间键盘输入a
g_run=1; //进入单步模式
current_pos-=4;
setTrackbarPos("Position","Example2_4",current_pos); //滑动条向前移动至4帧前
cout<<"Single step,run="<<g_run<<endl;
}
if(c=='d'){ //如果在播放期间键盘输入d
g_run=1; //进入单步模式
current_pos+=4;
setTrackbarPos("Position","Example2_4",current_pos); //滑动条向前移动至4帧后
cout<<"Single step,run="<<g_run<<endl;
}
if(c==32){
space_Count++; //按一次空格 值+1;
g_run=1*pow(-1,space_Count); //奇数次暂停 偶数次播放
}
if(c==27){ //判断是不是esc键(ASCII 27)
break; //跳出循环
}
}
}
将一个视频一帧一帧捕捉 将其转化为对数极坐标形式播放出来
头文件#include<opencv2/opencv.hpp>
#include<iostream>
write.open()函数
logPolar()函数
namedWindow("Example",WINDOW_AUTOSIZE);
namedWindow("Log_Polar",WINDOW_AUTOSIZE);
VideoCapture capture("D:/QT Projects/Photo/falseGod.mp4");
double fps=capture.get(CAP_PROP_FPS);
Size size((int)capture.get(CAP_PROP_FRAME_WIDTH),
capture.get(CAP_PROP_FRAME_HEIGHT));
VideoWriter writer;
writer.open("D:/QT Projects/Photo/1.mp4",CAP_OPENCV_MJPEG,fps,size);
cout<<fps;
Mat logpolar_frame,bgi_frame;
while(1){
capture>>bgi_frame;
if(bgi_frame.empty())break;
imshow("Example",bgi_frame);
//参数1 2 src:输入/输出图像 参数3 center:设置坐标原点位置
//参数4 M:尺度参数ρ = M × log(r)
//参数5 flags:标志位和插值方法
logPolar(bgi_frame,logpolar_frame,Point2f(bgi_frame.cols/2,bgi_frame.rows/2),
50,WARP_FILL_OUTLIERS);
imshow("Log_Polar",logpolar_frame);
writer<<logpolar_frame;
char c=waitKey(10);
if(c==27)break;
}
capture.release();