前一段时间领导让弄一个A柱的一个小功能 , 遇到了不少的难题(毕竟没有接触过 , 当时听见opencv都一脸懵逼) , 不过最后经过百般的努力 , 终于基本的功能已经实现啦 !
当然能定有错误的地方 , 也希望大家能够指出 !
以下面代码实现 :
摄像头的放大
摄像头的缩小
摄像头的旋转
摄像头的裁剪
摄像头的数据保存
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/opencv.hpp"
using namespace cv;
//取中间区域
int up_down_move = 190;
int left_right_move = 0;
//摄像头显示大小
int captureWidth = 1280;
int captureHeight = 720;
//裁剪大小
int width = 1280;
int height = 366;
// 旋转角度
double angle = 0;
// 缩放尺度
double scale = 1.0;
int main()
{
int mode;
//用来存放读取的视频序列
Mat frame;
//定义一个用来控制读取视频循环结束的变量
bool stop = false;
int key;
printf("请选择摄像头 '0' 内置 '1' 外置");
scanf("%d", &mode);
//创建VideoCapture对象
VideoCapture capture(mode);
//判断是否打开摄像头
if (capture.isOpened())
{
printf("打开成功!");
FileStorage read("parameter.yml", FileStorage::READ);
if(read.isOpened())
{
angle = (int)read["angle"];
scale = (double)read["scale"];
up_down_move = (int)read["up_down_move"];
left_right_move = (int)read["left_right_move"];
}
read.release();
}
else
{
printf("打开失败!");
}
cvNamedWindow("Carmera");
cvMoveWindow("Carmera", 0, 0);
capture.set(CV_CAP_PROP_FRAME_WIDTH, captureWidth);
capture.set(CV_CAP_PROP_FRAME_HEIGHT, captureHeight);
//获取帧率
//double rate = capture.get(CV_CAP_PROP_FPS);
//两帧间的间隔时间
//int delay = 1000/rate;
//滤波器的核
int kernel_size = 3;
Mat kernel = Mat::ones(kernel_size,kernel_size,CV_32F)/(float)(kernel_size*kernel_size);
while (!stop)
{
//读取frame
capture >> frame;
if(frame.empty())break;
key = cvWaitKey(2);
if(key==1048603)
{
stop = true;
break;
}
switch(key)
{
//上
case 1048695:
up_down_move -= 10;
if(up_down_move <= 0)
up_down_move = 0;
break;
//下
case 1048691:
up_down_move += 10;
if(up_down_move >= frame.rows*0.5)
up_down_move = (frame.rows*0.5)-10;
break;
//左
case 1048673:
left_right_move -= 10;
if(left_right_move <= 0)
left_right_move = 0;
break;
//右
case 1048676:
left_right_move ++;
if(width == captureWidth)
{
left_right_move = 0;
}
else
{
if(left_right_move >= frame.cols*0.5)
left_right_move=frame.cols*0.5;
}
break;
//保存
case 1048687:
{
FileStorage write("parameter.yml", FileStorage::WRITE);
write << "angle" << angle;
write << "scale" << scale;
write << "up_down_move" << up_down_move;
write << "left_right_move" << left_right_move;
write.release();
}
break;
//放大
case 1048637:
scale+=0.1;
if(scale >=10)
scale = 10;
break;
//缩小
case 1048621:
scale-=0.1;
if(scale<=1)
scale = 1;
break;
//旋转+
case 1048620:
angle++;
break;
//旋转-
case 1048622:
angle--;
break;
//复位
case 1048690:
up_down_move = 190;
left_right_move = 0;
angle = 0;
scale = 1.0;
break;
}
//裁剪
Rect rect(left_right_move,up_down_move,width, height);
Mat temp(frame, rect);
//加滤波程序
filter2D(temp,temp,-1,kernel);
//-------------------------------------------------------------------------------------
cv::Point2f center = cv::Point2f(temp.cols / 2, temp.rows / 2);
cv::Mat rotateMat;
rotateMat = cv::getRotationMatrix2D(center, angle, scale);
cv::Mat rotateImg;
cv::warpAffine(temp, rotateImg, rotateMat, temp.size());
imshow("Carmera",rotateImg);
//-------------------------------------------------------------------------------------
}
cvDestroyWindow("Carmera");
capture.release();
frame.release();
return 0;
}
效果图 :
源代码文件下载 :
如果有什么问题请回复 !