OpenCV-调用USB摄像机获取视频流,ROI特定提取,图像变换

任务:利用图像采集工具库对摄像机视频流的获取和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;  
  }


处理后得到图像

 

 

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;  
  
}


很明显看出来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;
}

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

 

 

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;

}


视频截图如下

 

 

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

彩色图像反转后如图

 

 

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

 

#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;

}


反转后图

 

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

假设待处理图像灰度级为【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;

}


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

OK,部分后期再补充,关于关注:小白算法,等你

 

使用python-opencv调用mjpg-stream视频流可以通过以下几个步骤实现: 1. 首先,我们需要安装python-opencv库。可以使用pip命令进行安装,如下所示: ``` pip install opencv-python ``` 2. 导入所需的库。我们需要导入opencv模块,以及用于从URL中读取视频流的模块urllib.request。代码如下: ```python import cv2 import urllib.request ``` 3. 定义视频流的URL。根据实际情况,将URL替换为相应的mjpg-stream视频流的URL。代码如下: ```python stream_url = "http://example.com/stream/video.mjpg" ``` 4. 使用urllib.request.urlopen()方法打开视频流URL,并读取其中的数据。代码如下: ```python stream = urllib.request.urlopen(stream_url) ``` 5. 使用cv2.VideoCapture()方法创建一个视频捕获对象,然后使用read()方法从视频流中读取每一帧图像数据。代码如下: ```python capture = cv2.VideoCapture(stream) ret, frame = capture.read() ``` 6. 在一个循环中,不断读取视频流中的每一帧图像数据,然后进行后续的处理。例如,可以显示图像、保存图像等。代码如下: ```python while True: ret, frame = capture.read() cv2.imshow("Video Stream", frame) # 处理图像数据的其他操作 if cv2.waitKey(1) == ord('q'): break capture.release() cv2.destroyAllWindows() ``` 在以上步骤中,我们首先安装了python-opencv库,然后导入所需的库,之后定义了视频流的URL。接着,通过urllib.request库打开视频流URL,并创建了一个视频捕获对象。最后,利用一个循环读取每一帧图像数据,并进行相应的处理,例如显示图像或保存图像。最后,释放资源并关闭窗口。 以上就是使用python-opencv调用mjpg-stream视频流的基本过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钱多多先森

你的鼓励,是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值