camera的开启
来源:互联网 发布:数组转化为json字符串 编辑:程序博客网 时间:2024/06/06 06:38
/*-----------camera open---------------------*/
/*--------------------------------------------------------------*/
/*-----------coding by wyz 2017/8/10------------------*/
/*--------------------------------------------------------------*/
#include <stdio.h>
#include <algorithm>
#include "IntImage.h"
using namespace std;
IntImage::IntImage():height(0),width(0),data(NULL),buf(NULL),variance(0.0),label(-1)
{
}
IntImage::~IntImage()
{
Clear();
}
void IntImage::Clear(void)
{
if(data == NULL)
ASSERT(buf == NULL);
else
{
ASSERT(buf != NULL);
for(int i=0; i<height; i++) data[i] = NULL;
delete[] data;
data = NULL;
delete[] buf;
buf = NULL;
height = width = 0;
variance = 0.0;
label = -1;
}
}
void IntImage::Copy(const IntImage& source)
// the ONLY way to make a copy of 'source' to this image
{
ASSERT(source.height > 0);
ASSERT(source.width > 0);
if(&source == this) return;
SetSize(MSize(source.height,source.width));
memcpy(buf,source.buf,sizeof(REAL)*height*width);
}
void IntImage::Load(const string& filename)
{
IplImage* img;
img = cvLoadImage(filename.c_str(),0);
SetSize(MSize(img->height,img->width));
for(int i=0,ih=img->height,iw=img->width; i<ih; i++)
{
REAL* pdata = data[i];
unsigned char* pimg = reinterpret_cast<unsigned char*>(img->imageData+img->widthStep*i);
for(int j=0; j<iw; j++) pdata[j] = pimg[j];
}
cvReleaseImage(&img);
}
void IntImage::IplImageToIntImage(IplImage* img)
{
IplImage* changedImage = cvCreateImage(cvSize(img->width,img->height),IPL_DEPTH_8U,1);
switch(img->nChannels)
{
case 1:
break;
case 2:
{
cvCvtColor(img,changedImage,CV_BGR5652GRAY);
break;
}
case 3:
{
cvCvtColor(img,changedImage,CV_BGR2GRAY);
break;
}
case 4:
{
cvCvtColor(img,changedImage,CV_BGRA2GRAY);
break;
}
}
SetSize(MSize(img->height,img->width));
for(int i=0,ih=img->height,iw=img->width; i<ih; i++)
{
REAL* pdata = data[i];
unsigned char* pimg = reinterpret_cast<unsigned char*>(changedImage->imageData+changedImage->widthStep*i);
for(int j=0; j<iw; j++) pdata[j] = pimg[j];
}
cvReleaseImage(&changedImage);
}
void IntImage::Save(const string& filename) const
{
IplImage* img;
img = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
for(int i=0,ih=img->height,iw=img->width; i<ih; i++)
{
REAL* pdata = data[i];
unsigned char* pimg = reinterpret_cast<unsigned char*>(img->imageData+img->widthStep*i);
for(int j=0; j<iw; j++) pimg[j] = (unsigned char)pdata[j];
}
cvSaveImage(filename.c_str(),img);
cvReleaseImage(&img);
}
IplImage* IntImage::IntImageToIplImage() const
{
IplImage* img;
img = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
for(int i=0,ih=img->height,iw=img->width; i<ih; i++)
{
REAL* pdata = data[i];
unsigned char* pimg = reinterpret_cast<unsigned char*>(img->imageData+img->widthStep*i);
for(int j=0; j<iw; j++) pimg[j] = (unsigned char)pdata[j];
}
return img;
}
void IntImage::SetSize(const MSize size)
// 'size' is the new size of the image, if necessary, memory is reallocated
// size.cx is the new height and size.cy is the new width
{
if((size.cx == height) && (size.cy == width) && (buf != NULL) && (data != NULL) ) return;
ASSERT(size.cx >= 0);
ASSERT(size.cy >= 0);
Clear();
height = size.cx;
width = size.cy;
buf = new REAL[height*width];
ASSERT(buf != NULL);
data = new REAL*[height];
ASSERT(data != NULL);
for(int i=0; i<height; i++) data[i] = &buf[i*width];
}
IntImage& IntImage::operator=(const IntImage& source)
{
SetSize(MSize(source.height,source.width));
memcpy(buf,source.buf,sizeof(*buf)*height*width);
label = source.label;
variance = source.variance;
return *this;
}
void IntImage::Resize(IntImage &result, REAL ratio) const
{
result.SetSize(MSize(int(height*ratio),int(width*ratio)));
ratio = 1/ratio;
for(int i=0,rh=result.height,rw=result.width; i<rh; i++)
for(int j=0; j<rw; j++)
{
int x0,y0;
REAL x,y,fx0,fx1;
x = j*ratio;
y = i*ratio;
x0 = (int)(x);
y0 = (int)(y);
//by Jianxin Wu
//1. The conversion of float to int in C is towards to 0 point, i.e. the floor function for positive numbers, and ceiling function for negative numbers.
//2. We only make use of ratio<1 in this applicaiton, and all numbers involved are positive.
//Using these, we have 0<=x<=height-1 and 0<=y<=width-1. Thus, boundary conditions check is not necessary.
//In languages other than C/C++ or ratio>=1, take care.
if (x0 == width-1) x0--;
if (y0 == height-1) y0--;
x = x - x0;
y = y - y0;
fx0 = data[y0][x0] + x*(data[y0][x0+1]-data[y0][x0]);
fx1 = data[y0+1][x0] + x*(data[y0+1][x0+1]-data[y0+1][x0]);
result.data[i][j] = fx0 + y*(fx1-fx0);
}
}
void IntImage::CalculateVarianceAndIntegralImageInPlace(void)
// We pad a zero column and a zero row, so 24*24 image will be 25*25 in size
{
REAL partialsum;
REAL ex,ex2;
REAL size,var;
ex = 0;
ex2 = 0;
for(int i=0,size=height*width; i<size; i++)
{
ex += buf[i];
ex2 += (buf[i]*buf[i]);
}
size = REAL(height*width);
var = ex2/size - (ex/size)*(ex/size);
ASSERT(var >= 0);
if(var>0)
variance = sqrt(var);
else
variance = 1.0;
for(int i=1; i<width; i++)
{
data[0][i] = data[0][i-1] + data[0][i];
}
for(int i=1; i<height; i++)
{
partialsum = 0;
for(int j=0; j<width; j++)
{
partialsum += data[i][j];
data[i][j] = data[i-1][j] + partialsum;
}
}
}
void IntImage::CalcSquareAndIntegral(IntImage& square, IntImage& image) const
{
REAL partialsum,partialsum2;
square.SetSize(MSize(height+1,width+1));
image.SetSize(MSize(height+1,width+1));
for(int i=0; i<=width+1; i++) square.buf[i]=image.buf[i]=0;
for(int i=1; i<=height; i++)
{
partialsum = partialsum2 = 0;
square.data[i][0] = 0;
image.data[i][0] = 0;
for(int j=1; j<=width; j++)
{
partialsum += (data[i-1][j-1]*data[i-1][j-1]);
partialsum2 += data[i-1][j-1];
square.data[i][j] = square.data[i-1][j] + partialsum;
image.data[i][j] = image.data[i-1][j] + partialsum2;
}
}
}
void SwapIntImage(IntImage& i1,IntImage& i2)
{
std::swap(i1.height,i2.height);
std::swap(i1.width,i2.width);
std::swap(i1.buf,i2.buf);
std::swap(i1.data,i2.data);
std::swap(i1.variance,i2.variance);
std::swap(i1.label,i2.label);
}
/*--------------------------------------------------------------*/
/*-----------coding by wyz 2017/8/10------------------*/
/*--------------------------------------------------------------*/
#include <stdio.h>
#include <algorithm>
#include "IntImage.h"
using namespace std;
IntImage::IntImage():height(0),width(0),data(NULL),buf(NULL),variance(0.0),label(-1)
{
}
IntImage::~IntImage()
{
Clear();
}
void IntImage::Clear(void)
{
if(data == NULL)
ASSERT(buf == NULL);
else
{
ASSERT(buf != NULL);
for(int i=0; i<height; i++) data[i] = NULL;
delete[] data;
data = NULL;
delete[] buf;
buf = NULL;
height = width = 0;
variance = 0.0;
label = -1;
}
}
void IntImage::Copy(const IntImage& source)
// the ONLY way to make a copy of 'source' to this image
{
ASSERT(source.height > 0);
ASSERT(source.width > 0);
if(&source == this) return;
SetSize(MSize(source.height,source.width));
memcpy(buf,source.buf,sizeof(REAL)*height*width);
}
void IntImage::Load(const string& filename)
{
IplImage* img;
img = cvLoadImage(filename.c_str(),0);
SetSize(MSize(img->height,img->width));
for(int i=0,ih=img->height,iw=img->width; i<ih; i++)
{
REAL* pdata = data[i];
unsigned char* pimg = reinterpret_cast<unsigned char*>(img->imageData+img->widthStep*i);
for(int j=0; j<iw; j++) pdata[j] = pimg[j];
}
cvReleaseImage(&img);
}
void IntImage::IplImageToIntImage(IplImage* img)
{
IplImage* changedImage = cvCreateImage(cvSize(img->width,img->height),IPL_DEPTH_8U,1);
switch(img->nChannels)
{
case 1:
break;
case 2:
{
cvCvtColor(img,changedImage,CV_BGR5652GRAY);
break;
}
case 3:
{
cvCvtColor(img,changedImage,CV_BGR2GRAY);
break;
}
case 4:
{
cvCvtColor(img,changedImage,CV_BGRA2GRAY);
break;
}
}
SetSize(MSize(img->height,img->width));
for(int i=0,ih=img->height,iw=img->width; i<ih; i++)
{
REAL* pdata = data[i];
unsigned char* pimg = reinterpret_cast<unsigned char*>(changedImage->imageData+changedImage->widthStep*i);
for(int j=0; j<iw; j++) pdata[j] = pimg[j];
}
cvReleaseImage(&changedImage);
}
void IntImage::Save(const string& filename) const
{
IplImage* img;
img = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
for(int i=0,ih=img->height,iw=img->width; i<ih; i++)
{
REAL* pdata = data[i];
unsigned char* pimg = reinterpret_cast<unsigned char*>(img->imageData+img->widthStep*i);
for(int j=0; j<iw; j++) pimg[j] = (unsigned char)pdata[j];
}
cvSaveImage(filename.c_str(),img);
cvReleaseImage(&img);
}
IplImage* IntImage::IntImageToIplImage() const
{
IplImage* img;
img = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
for(int i=0,ih=img->height,iw=img->width; i<ih; i++)
{
REAL* pdata = data[i];
unsigned char* pimg = reinterpret_cast<unsigned char*>(img->imageData+img->widthStep*i);
for(int j=0; j<iw; j++) pimg[j] = (unsigned char)pdata[j];
}
return img;
}
void IntImage::SetSize(const MSize size)
// 'size' is the new size of the image, if necessary, memory is reallocated
// size.cx is the new height and size.cy is the new width
{
if((size.cx == height) && (size.cy == width) && (buf != NULL) && (data != NULL) ) return;
ASSERT(size.cx >= 0);
ASSERT(size.cy >= 0);
Clear();
height = size.cx;
width = size.cy;
buf = new REAL[height*width];
ASSERT(buf != NULL);
data = new REAL*[height];
ASSERT(data != NULL);
for(int i=0; i<height; i++) data[i] = &buf[i*width];
}
IntImage& IntImage::operator=(const IntImage& source)
{
SetSize(MSize(source.height,source.width));
memcpy(buf,source.buf,sizeof(*buf)*height*width);
label = source.label;
variance = source.variance;
return *this;
}
void IntImage::Resize(IntImage &result, REAL ratio) const
{
result.SetSize(MSize(int(height*ratio),int(width*ratio)));
ratio = 1/ratio;
for(int i=0,rh=result.height,rw=result.width; i<rh; i++)
for(int j=0; j<rw; j++)
{
int x0,y0;
REAL x,y,fx0,fx1;
x = j*ratio;
y = i*ratio;
x0 = (int)(x);
y0 = (int)(y);
//by Jianxin Wu
//1. The conversion of float to int in C is towards to 0 point, i.e. the floor function for positive numbers, and ceiling function for negative numbers.
//2. We only make use of ratio<1 in this applicaiton, and all numbers involved are positive.
//Using these, we have 0<=x<=height-1 and 0<=y<=width-1. Thus, boundary conditions check is not necessary.
//In languages other than C/C++ or ratio>=1, take care.
if (x0 == width-1) x0--;
if (y0 == height-1) y0--;
x = x - x0;
y = y - y0;
fx0 = data[y0][x0] + x*(data[y0][x0+1]-data[y0][x0]);
fx1 = data[y0+1][x0] + x*(data[y0+1][x0+1]-data[y0+1][x0]);
result.data[i][j] = fx0 + y*(fx1-fx0);
}
}
void IntImage::CalculateVarianceAndIntegralImageInPlace(void)
// We pad a zero column and a zero row, so 24*24 image will be 25*25 in size
{
REAL partialsum;
REAL ex,ex2;
REAL size,var;
ex = 0;
ex2 = 0;
for(int i=0,size=height*width; i<size; i++)
{
ex += buf[i];
ex2 += (buf[i]*buf[i]);
}
size = REAL(height*width);
var = ex2/size - (ex/size)*(ex/size);
ASSERT(var >= 0);
if(var>0)
variance = sqrt(var);
else
variance = 1.0;
for(int i=1; i<width; i++)
{
data[0][i] = data[0][i-1] + data[0][i];
}
for(int i=1; i<height; i++)
{
partialsum = 0;
for(int j=0; j<width; j++)
{
partialsum += data[i][j];
data[i][j] = data[i-1][j] + partialsum;
}
}
}
void IntImage::CalcSquareAndIntegral(IntImage& square, IntImage& image) const
{
REAL partialsum,partialsum2;
square.SetSize(MSize(height+1,width+1));
image.SetSize(MSize(height+1,width+1));
for(int i=0; i<=width+1; i++) square.buf[i]=image.buf[i]=0;
for(int i=1; i<=height; i++)
{
partialsum = partialsum2 = 0;
square.data[i][0] = 0;
image.data[i][0] = 0;
for(int j=1; j<=width; j++)
{
partialsum += (data[i-1][j-1]*data[i-1][j-1]);
partialsum2 += data[i-1][j-1];
square.data[i][j] = square.data[i-1][j] + partialsum;
image.data[i][j] = image.data[i-1][j] + partialsum2;
}
}
}
void SwapIntImage(IntImage& i1,IntImage& i2)
{
std::swap(i1.height,i2.height);
std::swap(i1.width,i2.width);
std::swap(i1.buf,i2.buf);
std::swap(i1.data,i2.data);
std::swap(i1.variance,i2.variance);
std::swap(i1.label,i2.label);
}
阅读全文
0 0
- camera的开启
- 使用camera来开启一个自己的预览界面
- camera首次开启,权限提示时home退出,两次点击camera才可以进camera
- 自定义设备管理器程序实现camera控制开启关闭
- IP Camera 和 Web Camera 的区别
- Android 的camera.setPreviewCallbackWithBuffer和camera.addCallbackBuffer
- Android 的camera.setPreviewCallbackWithBuffer和camera.addCallbackBuffer
- s3c2440的camera interface
- 实现自己的Camera
- Camera的几个概念
- camera的分辨率
- camera的分辨率
- 实现自己的Camera
- Camera的方法
- camera的分辨率
- PHONEGAP 的CAMERA解析
- Camera的專業用語說明集
- camera的分辨率
- curl常见用法
- Unity3D shader(7)——Vertex Shader(顶点几何变换)
- vim开启行号显示及全局设置
- 第二次请求时没有带上session的问题
- 学习一个朱刘算法
- camera的开启
- js原生数组去重
- java多线程学习总结
- 缓存处理(三)
- org.hibernate.AnnotationException:(hibernate没有添加配置文件)
- (3)表的增删改查
- 【雪野实训记录】Oracle宾馆管理系统-L2综合项目案例
- mysql存储过程之错误处理
- log4j2.pom