cvresize源碼
① 請教OPENCV的RESIZE函數
最新版OpenCV2.4.7中,cv::resize函數有五種插值演算法:最近鄰、雙線性、雙三次、基於像素區域關系、蘭索斯插值。下面用for循環代替cv::resize函數來說明其詳細的插值實現過程,其中部分代碼摘自於cv::resize函數中的源代碼。
每種插值演算法的前部分代碼是相同的,如下:
[cpp] view plain
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
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.at<cv::Vec3b>(j, i) = matSrc.at<cv::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等進行優化加速。
② 請教大神。基於AdaBoost演算法的人臉檢測。程序怎麼改可以使檢測後人臉區域是矩形 (現在是圓形)
目前在實際中應用的人臉檢測方法多為基於 Adaboost 學習演算法的方法。
Viola人臉檢測方法是一種基於積分圖、 級聯檢測器和AdaBoost 演算法的方法,方法框架可以分為以下三大部分:
第一部分,使用Harr-like特徵表示人臉, 使用逗 積分圖地實現特徵數值的快速計算;
第二部分, 使用Adaboost演算法挑選出一些最能代表人臉的矩形特徵( 弱分類器),按照加權投票的方式將弱分類器構造為一個強分類器;
第三部分, 將訓練得到的若干強分類器串聯組成一個級聯結構的層疊分類器,級聯結構能有效地提高分類器的檢測速度。廣州的顏鑒在人臉檢測國際榜FDDB排名世界第三。
Adaboost 演算法是一種用來分類的方法,它的基本原理就是逗三個臭皮匠,頂個諸葛亮地。它把一些比較弱的分類方法合在一起,組合出新的很強的分類方法。
③ 0xc0000005 讀取位置0x00000000時發生訪問沖突
內存訪問越界問題
好好檢查你的指針吧,別讓它們亂指
④ cmake編譯opencv程序的時候怎麼靜態編譯
使用opencv需要編譯源碼,得到庫文件。可以用cmake構建項目後編譯,也可以直接用官方提供的編譯好的版本。 官方提供的編譯庫一般只是標准版本,沒有附加某些庫,比如tbb等,要想讓opencv使用tbb等庫,就只能自己構建項目後編譯。
⑤ 如何用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_ = 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_ )
frame_ = cvCreateImage( cvSize(frame->width,frame->height),
IPL_DEPTH_8U, frame->nChannels );
if( frame->origin == IPL_ORIGIN_TL )
cvCopy( frame, frame_, 0 );
else
cvFlip( frame, frame_, 0 );
detect_and_draw( frame_ );
if( cvWaitKey( 10 ) >= 0 )
break;
}
cvReleaseImage( &frame_ );
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 );
}
⑥ opencv 圖像檢測角點時出了問題...
檢查下cvGoodFeaturesToTrack()函數輸入格式是否正確:image ,eig_image ,temp_image;這三個格式分別是:uchar/F32,F32,F32
不是格式問題,確保imgA的取到圖像的前提下,修改後面參數「3,0,04」為「3,1,0.04」試試