b2c信息网

您现在的位置是:首页 > 热点问题 > 正文

热点问题

cvresize源码(cvresize使用)

hacker2022-06-12 08:33:14热点问题85
本文目录一览:1、请教OPENCV的RESIZE函数

本文目录一览:

请教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等库,就只能自己构建项目后编译。

发表评论

评论列表

  • 酒奴南戈(2022-06-12 09:07:53)回复取消回复

    rc.rows - 1); matDst1.atcv::Vec3b(j, i) = matSrc.atcv::Vec3b(sy, sx); }

  • 竹祭任谁(2022-06-12 17:39:01)回复取消回复

    eight/scale)),8, 1 );int i;cvCvtColor( img, gray, CV_BGR2GRAY );cvResize( gray, small_img, CV_INTER_LINEAR );cvEqualizeH