任务:利用图像采集工具库对摄像机视频流的获取和ROI特定区域提取

 

目录

0:原图获取

0.0.调整窗口大小

1. 接下来对采集到的视频图像特定区域ROI裁剪

2. 现在,我们对原图进行镜像处理

3 .现在,对原图中心旋转

4 .图像反转,即黑变白,白变黑,彩色图像也是可以反转的


0:原图获取

采用如下的代码采集图像,采集到的图像如下图所示,为视频截图

#include<opencv2/opencv.hpp>

using namespace cv;

int main()  
{  
    VideoCapture capture(0);  
      
    while (1)  
    {  
        Mat frame;  
        capture >> frame;  
        namedWindow("视频图像");  
        imshow("视频图像", frame);   
        waitKey(30);  
  
    }  
  
    return 0;  
  }

 

 

0.0.调整窗口大小

代码如下

#include<opencv2/opencv.hpp>
using namespace cv;

int main()  
{  
    VideoCapture capture(0);  
      
    while (1)  
    {  
        Mat frame;  
        capture >> frame;  

	resize(frame, frame, Size(320, 480));

        namedWindow("视频图像");  
        imshow("视频图像", frame);   
        waitKey(30);  
  
    }  
  
    return 0;  
  }

处理后得到图像

 

opencv 下采样 opencv usb相机采集视频_OpenCV基础知识

 

1. 接下来对采集到的视频图像特定区域ROI裁剪

#include<opencv2/opencv.hpp>
using namespace cv;
int main()  
{  
    VideoCapture capture(0);  
      
    while (1)  
    {  
        Mat frame;  
        capture >> frame;  
        namedWindow("视频图像");  
        imshow("视频图像", frame);
      //ROI区域裁剪  
        Mat roi = frame(Range(220, 476), Range(180, 476));  
          
        namedWindow("roi");  
        imshow("roi", roi);  
        waitKey(30);  
  
    }  
  
    return 0;  
  
}

opencv 下采样 opencv usb相机采集视频_视频流_02

很明显看出来roi区域小窗口,大小为Range(220, 476), Range(180, 476)

 

2. 现在,我们对原图进行镜像处理

代码段如下

#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
	VideoCapture capture(0);
	
	while (1)
	{
		Mat frame;
		capture >> frame;
/镜像处理//
		Mat dst;
		flip(frame, dst,1);
	///
		namedWindow("视频图像");
	imshow("视频图像", dst);
	waitKey(30);
	}
	return 0;
}

视频截图如下(与原图对比)

opencv 下采样 opencv usb相机采集视频_图像镜像 中心变换 大小调整_03

 

 

3 .现在,对原图中心旋转

代码如下

 

#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
	VideoCapture capture(0);
	
	while (1)
	{
		Mat frame;
		capture >> frame;
//中心旋转/
               double angle = 180;
		Point2f src_center(frame.cols / 2.0F, frame.rows / 2.0F); //rotate center(旋转中心坐标)
		Mat rot_mat = getRotationMatrix2D(src_center, angle, 1.0); //get rotate matrix
		Mat dst;
		warpAffine(frame, dst, rot_mat, frame.size()); //rotate
//
               namedWindow("视频图像");
		imshow("视频图像", dst);
	
		waitKey(30);
	}
	return 0;

}

视频截图如下

 

opencv 下采样 opencv usb相机采集视频_opencv 下采样_04

 

4 .图像反转,即黑变白,白变黑,彩色图像也是可以反转的

彩色图像反转后如图

 

opencv 下采样 opencv usb相机采集视频_ROI_05

 

现在奉上黑白图像反转的代码(直接访问像素,对像素做更改)

 

#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
	VideoCapture capture(0);
	
	while (1)
	{
		Mat frame;
		capture >> frame;
		Mat gray;
		cvtColor(frame, gray, CV_BGR2GRAY);
		图像反转///
		int i, j;
		int height, width;

		height = gray.rows;//行
		width = gray.cols*gray.channels();//列*通道数

		for (i = 0; i < height; i++)
		{
			for (j = 0; j < width; j++)
			{
				gray.at<uchar>(i, j) = 255 - gray.at<uchar>(i, j); //灰度级[0,255],反转表达式s=255-r 
			}
		}
		/
		namedWindow("反转");
		imshow("反转", gray);
	
		waitKey(30);
	}
	return 0;

}

反转后图

 

opencv 下采样 opencv usb相机采集视频_ROI_06

注意:图像变换里面很多种变换形式,只需要改变表达式运算式,就可以实现不同形式的变换了。

假设待处理图像灰度级为【0,L-1】,反转的表达式为s=L-1-r,r为待处理图片的像素值;

对数变换的表达式为:s=c*log(1+r);

幂次变换表达式为:s=cr的γ次幂。

以此类推,就可以多种变换了

 

现在介绍一种更简单的,直接采用函数bitwise_not();

C++: void bitwise_not(InputArray src, OutputArray dst, InputArray mask=noArray());

完整代码如下所示

#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
	VideoCapture capture(0);
	
	while (1)
	{
		Mat frame;
		capture >> frame;
		Mat gray;
		cvtColor(frame, gray, CV_BGR2GRAY);
		图像反转///
		bitwise_not(gray, gray, noArray());
		/
		namedWindow("反转");
		imshow("反转", gray);
	
		waitKey(30);
	}
	return 0;

}

图像与上面一种处理得到的图像是一样的,自行参考