《OpenCV》Part8 OpenCV3.1.0 图像相加与曝光
2016-11-23 18:51
375 查看
《OpenCV》Part8 OpenCV3.1.0 图像相加与曝光
1、OpenCV版本问题:
OpenCV1中的函数为void cvAcc(const CvArr* src, CvArr* dst, const CvAcc* mask=NULL),参数src为输入图像,可以为单通道或者三通道,8位或者32位浮点型。dst为累加目标图像,大小和通道数与输入图像相同,32位或者64位浮点型。mask为可选择的操作mask。
原程序代码为
OpenCV2和Opencv3中对应函数为void accumulate(InputArray src, InputOutputArray dst, InputArray mask=noArray() ),
参数同前,可用代码为
注:
1)、上面的CV_32F需要注意通道数,下面的实例代码用的是CV_32FC3
2)、cvtColor(img_src1, gray1, CV_BGR2GRAY);//变成了单通道的帧,在累加的时候就不能与彩色三通道的图片相加,否则报错
3)、OpenCV2、Opencv3中:Mat average = Mat::zeros(img_src1.size(), CV_32FC3);//存储累加后数据的对象赋值为零
而OpenCV1中:cvZero(imgsum);
2、实例,三帧图像叠加:
.cpp:
3、多帧图像叠加示例:
两个窗口显示的不一样,一个运动时会有拖影,就是要拖影(不过看得好晕),才能达到叠加的效果。
1、OpenCV版本问题:
OpenCV1中的函数为void cvAcc(const CvArr* src, CvArr* dst, const CvAcc* mask=NULL),参数src为输入图像,可以为单通道或者三通道,8位或者32位浮点型。dst为累加目标图像,大小和通道数与输入图像相同,32位或者64位浮点型。mask为可选择的操作mask。
原程序代码为
IplImage *Igray1=cvCreateImage(cvSize ( Igray->width, Igray->height ), IPL_DEPTH_32F, 1); IplImage *Igrayc = cvLoadImage( imagepath, CV_LOAD_IMAGE_GRAYSCALE ); cvAcc(Igrayc,Igray1); cvReleaseImage( &Igrayc );
OpenCV2和Opencv3中对应函数为void accumulate(InputArray src, InputOutputArray dst, InputArray mask=noArray() ),
参数同前,可用代码为
Mat img1=imread("D:\\sperm10060per.bmp",0); imshow("src",img1); Mat average=Mat::zeros(img1.size(),CV_32F);//存储累加后数据的对象赋值为零 accumulate(img1,average);//累加到average Mat img3=imread("D:\\sperm10060per.bmp",0); accumulate(img3,average);//再次累加 average/=2;//累加结果除以累加次数 average.convertTo(average,CV_8U);//如果显示需要将数据转换为8U imshow("average",average);//显示 notice:如果显示图像,需要将图转换为CV_8U
注:
1)、上面的CV_32F需要注意通道数,下面的实例代码用的是CV_32FC3
2)、cvtColor(img_src1, gray1, CV_BGR2GRAY);//变成了单通道的帧,在累加的时候就不能与彩色三通道的图片相加,否则报错
3)、OpenCV2、Opencv3中:Mat average = Mat::zeros(img_src1.size(), CV_32FC3);//存储累加后数据的对象赋值为零
而OpenCV1中:cvZero(imgsum);
2、实例,三帧图像叠加:
.cpp:
#include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp> #include <opencv2/video.hpp> #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/ml/ml.hpp" #include <cstring> using namespace std; using namespace cv; #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/ml/ml.hpp" using namespace std; using namespace cv; int main(int argc, char* argv[]) { Mat img_src1, img_src2, img_src3;//存储连续的3帧 Mat img_dst, gray1, gray2, gray3; //Mat gray;//用来显示前景的 bool pause = false; VideoCapture video_file("bike.avi");//"bike.avi"//在这里改相应的文件名,输入也可以为摄像头设备 输入形式为 '0' namedWindow("foreground", 0); namedWindow("average", 1); for (;;) { if (!pause) { video_file >> img_src1; //cvtColor(img_src1, gray1, CV_BGR2GRAY);//变成了单通道的帧 Mat average = Mat::zeros(img_src1.size(), CV_32FC3);//存储累加后数据的对象赋值为零 accumulate(img_src1, average);//累加到average waitKey(5); video_file >> img_src2; //cvtColor(img_src2, gray2, CV_BGR2GRAY); imshow("foreground", img_src2);// accumulate(img_src2, average);//第二帧累加到average waitKey(5); video_file >> img_src3; //cvtColor(img_src3, gray3, CV_BGR2GRAY); accumulate(img_src3, average);//第三帧累加到average average /= 3;//不除的话图片亮度就会很高 average.convertTo(average, CV_8U);//如果显示需要将数据转换为8U imshow("average", average);//显示 } char key = cv::waitKey(50); if (key == 33) { break; } if (key == ' ') pause = !pause; } return 0; }
3、多帧图像叠加示例:
#include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp> #include <opencv2/video.hpp> #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/ml/ml.hpp" #include <cstring> using namespace std; using namespace cv; #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/ml/ml.hpp" using namespace std; using namespace cv; int main(int argc, char* argv[]) { Mat img[8]; Mat average; bool pause = false; VideoCapture video_file(0/*"bike.avi"*/);//"bike.avi"//在这里改相应的文件名,输入也可以为摄像头设备 输入形式为 '0' namedWindow("foreground", 0); namedWindow("average", 1); int i = 0; for (int j=0;;j++) { video_file >> img[0]; average = Mat::zeros(img[0].size(), CV_32FC3);//存储累加后数据的对象赋值为零,放在循环中会在每次循环中都重新置零 for (i = 1; i < 8;i++) { video_file >> img[i]; waitKey(5); imshow("foreground", img[i]); accumulate(img[i], average);//累加到average } average /= i; average.convertTo(average, CV_8U); imshow("average", average); char key = cv::waitKey(50); if (key == 45) { break; } if (key == ' ') pause = !pause; } return 0; }
两个窗口显示的不一样,一个运动时会有拖影,就是要拖影(不过看得好晕),才能达到叠加的效果。
相关文章推荐
- openCV 图像相加,位运算,协方差,绝对值,比较
- 题目:利用OpenCV3.1.0从磁盘加载并显示一副图像
- Opencv图像识别从零到精通(12)-----滑动条控制直方图、对比度、亮度、图像相加
- opencv3.1.0 特征点检测与图像匹配(features2d、xfeatures2d)
- openCV 图像相加,位运算,协方差,绝对值,比较
- 图像相加---OpenCV系列
- 《OpenCV》Part6 OpenCV3.1.0 用直线拟合图像中的物体
- 【OpenCV图像处理】一、图像相加、相减、相乘与相除的实现
- OpenCV3.1.0中调用MHI(Motion History Images, 运动历史图像)
- OpenCV自带例子(三)两幅图像相加
- opencv中序列图像相加
- SIFT图像特征提取 python3.4 + opencv3.1.0代码
- 图像识别(8)——使用OpenCV预览USB摄像头+曝光设置
- python3.4实现调用opencv3.1.0显示图像
- OpenCV支持的图像格式
- 【OpenCV】通过ROI区域以及掩码实现图像叠加
- 使用GDI+显示OpenCV中的图像IplImage
- 使用GDAL构造OpenCV的图像格式
- [opencv]图像处理的基本数据类型以及通道和维度理解
- 利用OpenCV进行图像配准