opencv - 摄像头(项目)

前一段时间领导让弄一个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;
}



效果图 :




源代码文件下载 :

点击打开链接


如果有什么问题请回复 !

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值