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

来源:互联网 发布:qq空间破解软件linux 编辑:程序博客网 时间:2024/05/29 05:13

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

#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.调整窗口大小

代码如下

#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 matrixMat 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,部分后期再补充
1 0
原创粉丝点击