任务:利用图像采集工具库对摄像机视频流的获取和ROI特定区域提取
目录
0:原图获取
0.0.调整窗口大小
1. 接下来对采集到的视频图像特定区域ROI裁剪
2. 现在,我们对原图进行镜像处理
3 .现在,对原图中心旋转
4 .图像反转,即黑变白,白变黑,彩色图像也是可以反转的
采用如下的代码采集图像,采集到的图像如下图所示,为视频截图
#include
using namespace cv;
int main()
{
VideoCapture capture(0);
while (1)
{
Mat frame;
capture >> frame;
namedWindow("视频图像");
imshow("视频图像", frame);
waitKey(30);
}
return 0;
}
代码如下
#include
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;
}
处理后得到图像
#include
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)
代码段如下
#include
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;
}
视频截图如下(与原图对比)
代码如下
#include
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;
}
视频截图如下
彩色图像反转后如图
现在奉上黑白图像反转的代码(直接访问像素,对像素做更改)
#include
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(i, j) = 255 - gray.at(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
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,部分后期再补充,关于关注:小白算法,等你