您的位置:首页 > 运维架构

《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。

原程序代码为
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;
}


        两个窗口显示的不一样,一个运动时会有拖影,就是要拖影(不过看得好晕),才能达到叠加的效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: