cvresize源码(cvresize使用)
本文目录一览:
请教OPENCV的RESIZE函数
最新版OpenCV2.4.7中,cv::resize函数有五种插值算法:最近邻、双线性、双三次、基于像素区域关系、兰索斯插值。下面用for循环代替cv::resize函数来说明其详细的插值实现过程,其中部分代码摘自于cv::resize函数中的源代码。
每种插值算法的前部分代码是相同的,如下:
[cpp] view plain copy
cv::Mat matSrc, matDst1, matDst2;
matSrc = cv::imread("lena.jpg", 2 | 4);
matDst1 = cv::Mat(cv::Size(800, 1000), matSrc.type(), cv::Scalar::all(0));
matDst2 = cv::Mat(matDst1.size(), matSrc.type(), cv::Scalar::all(0));
double scale_x = (double)matSrc.cols / matDst1.cols;
double scale_y = (double)matSrc.rows / matDst1.rows;
1、最近邻:公式
[cpp] view plain copy
for (int i = 0; i matDst1.cols; ++i)
{
int sx = cvFloor(i * scale_x);
sx = std::min(sx, matSrc.cols - 1);
for (int j = 0; j matDst1.rows; ++j)
{
int sy = cvFloor(j * scale_y);
sy = std::min(sy, matSrc.rows - 1);
matDst1.atcv::Vec3b(j, i) = matSrc.atcv::Vec3b(sy, sx);
}
}
cv::imwrite("nearest_1.jpg", matDst1);
cv::resize(matSrc, matDst2, matDst1.size(), 0, 0, 0);
cv::imwrite("nearest_2.jpg", matDst2);
2、双线性:由相邻的四像素(2*2)计算得出,公式,
3、双三次:由相邻的4*4像素计算得出,公式类似于双线性
4、基于像素区域关系:共分三种情况,图像放大时类似于双线性插值,图像缩小(x轴、y轴同时缩小)又分两种情况,此情况下可以避免波纹出现。
5、兰索斯插值:由相邻的8*8像素计算得出,公式类似于双线性
以上代码的实现结果与cv::resize函数相同,但是执行效率非常低,只是为了详细说明插值过程。OpenCV中默认采用C++ Concurrency进行优化加速,你也可以采用TBB、OpenMP等进行优化加速。
如何用OPENCV和VC实现人眼识别功能?
给你个代码,人眼睛识别:
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include stdio.h
#ifdef _EiC
#define WIN32
#endif
static CvMemStorage* storage = 0;
static CvHaarClassifierCascade* cascade = 0;
void detect_and_draw( IplImage* image );
const char* cascade_name =
"haarcascade_eye.xml";//人脸检测分类器
int main( int argc, char** argv )
{
CvCapture* capture = 0;
IplImage *frame, *frame_copy = 0;
int optlen = strlen("--cascade=");
const char* input_name;
if( argc 1 strncmp( argv[1], "--cascade=", optlen ) == 0 )
{
cascade_name = argv[1] + optlen;
input_name = argc 2 ? argv[2] : 0;
}
else
{
cascade_name = "C:/OpenCV2.0/data/haarcascades/haarcascade_eye.xml";//分类器路径
input_name = argc 1 ? argv[1] : 0;
}
cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
if( !cascade )//如果没有找到分类器,输出以下
{
fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
fprintf( stderr,
"Usage: facedetect --cascade=\"cascade_path\" [filename|camera_index]\n" );
return -1;
}
storage = cvCreateMemStorage(0);
capture = cvCaptureFromCAM( !input_name ? 0 : input_name[0] - '0' );//读取摄像头
if(!capture)//如果没有摄像头读取视频文件
capture = cvCaptureFromAVI("检测.avi");
cvNamedWindow( "result", 1);//创建窗口
if( capture )
{
for(;;)
{
if( !cvGrabFrame( capture ))//从摄像头中抓取帧
break;
frame = cvRetrieveFrame( capture );//读取上边抓取的帧
if( !frame )
break;
if( !frame_copy )
frame_copy = cvCreateImage( cvSize(frame-width,frame-height),
IPL_DEPTH_8U, frame-nChannels );
if( frame-origin == IPL_ORIGIN_TL )
cvCopy( frame, frame_copy, 0 );
else
cvFlip( frame, frame_copy, 0 );
detect_and_draw( frame_copy );
if( cvWaitKey( 10 ) = 0 )
break;
}
cvReleaseImage( frame_copy );
cvReleaseCapture( capture );
}
else//没检测到视频文件或者摄像头
{
const char* filename = (char*)"检测.jpg";//读图片
IplImage* image = cvLoadImage( filename, 1 );
if( image )
{
detect_and_draw( image );
cvWaitKey(0);
cvReleaseImage( image );
}
else
{
FILE* f = fopen( filename, "rt" );
if( f )
{
char buf[1000+1];
while( fgets( buf, 1000, f ) )
{
int len = (int)strlen(buf);
while( len 0 isspace(buf[len-1]) )
len--;
buf[len] = '\0';
image = cvLoadImage( buf, 1 );
if( image )
{
detect_and_draw( image );
cvWaitKey(0);
cvReleaseImage( image );
}
}
fclose(f);
}
}
}
cvDestroyWindow("result");
return 0;
}
void detect_and_draw( IplImage* img )
{
static CvScalar colors[] =
{
{{0,0,255}},
{{0,128,255}},
{{0,255,255}},
{{0,255,0}},
{{255,128,0}},
{{255,255,0}},
{{255,0,0}},
{{255,0,255}}
};
double scale = 1.3;
IplImage* gray = cvCreateImage( cvSize(img-width,img-height), 8, 1 );
IplImage* small_img = cvCreateImage( cvSize( cvRound (img-width/scale),
cvRound (img-height/scale)),
8, 1 );
int i;
cvCvtColor( img, gray, CV_BGR2GRAY );
cvResize( gray, small_img, CV_INTER_LINEAR );
cvEqualizeHist( small_img, small_img );
cvClearMemStorage( storage );
if( cascade )
{
double t = (double)cvGetTickCount();
CvSeq* faces = cvHaarDetectObjects( small_img, cascade, storage,
1.1, 2, 0/*CV_HAAR_DO_CANNY_PRUNING*/,
cvSize(30, 30) );//检测人脸返回矩形人脸
t = (double)cvGetTickCount() - t;
printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );
for( i = 0; i (faces ? faces-total : 0); i++ )//找到矩形中心,把矩形转化为圆形
{
CvRect* r = (CvRect*)cvGetSeqElem( faces, i );
CvPoint center;
int radius;
center.x = cvRound((r-x + r-width*0.5)*scale);
center.y = cvRound((r-y + r-height*0.5)*scale);
radius = cvRound((r-width + r-height)*0.25*scale);
cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );
}
}
cvShowImage( "result", img );
cvReleaseImage( gray );
cvReleaseImage( small_img );
}
cmake编译opencv程序的时候怎么静态编译
使用opencv需要编译源码,得到库文件。可以用cmake构建项目后编译,也可以直接用官方提供的编译好的版本。 官方提供的编译库一般只是标准版本,没有附加某些库,比如tbb等,要想让opencv使用tbb等库,就只能自己构建项目后编译。