365体育网址~不过并不曾都跑起来

读书opencv汉语版教程——第②章

   记录cvSmooth函数的用法和 OpenCV自带的人脸检测。

富有案例,跑起来~~~然则并没有都跑起来。。。笔者只把自己能跑的都尽量跑了,毕竟看书照旧很生硬,能运作能出结果,才相比好。

(1)cvSmooth函数
void cvSmooth( const CvArr* src, CvArr* dst,int
smoothtype=CV_GAUSSIAN,int param1, int param2, double param3, double
param4 );
src:输入图像.
dst:输出图像.
smoothtype平滑方法
  CV_BLUR_NO_SCALE(简单不带尺度变换的歪曲),对种种象素的
param1×param2 领域求和。假诺邻域大小是转变的,能够事先选取函数 cvIntegral
总括积分图像。
   CV_BLUR (simple blur)-
-对各个象素param1×param2邻域求和并做规范变换 1/(param1×param2)。
   CV_GAUSSIAN(gaussian blur) – -对图像进行核大小为 param1×param2
的高斯卷积。
   CV_MEDIAN(median blur) – -对图像进行核大小为param1×param1
的中值滤波 (邻域是方的)。
   CV_BILATERAL(双向滤波) – -应用双向 3×3 滤波,彩色
sigma=param1,空间 sigma=param2.。

 

param1:平滑操作的率先个参数.
param2:平滑操作的第1个参数.
对于简易/非标准化变换的高斯模糊的情况,假设param2的值为零,则表示其被设定为param1。
param3
  对应高斯参数的 Gaussian sigma (标准差).
如若为零,则标准差由下边的核尺寸计算:
  sigma = (n/2 – 1)*0.3 + 0.8,
其间 n=param1 对应水平核,n=param2 对应垂直核.
  对小的卷积核 (3×3 to 7×7) 使用如上公式所示的正儿八经 sigma
速度会快。假如 param3 不为零,而 param1 和 param2 为零,则核大小由sigma
计算 (以保障充足精确的操作)。

越着急,心越慌,越是着急,越要慢,越是不熟悉,越无法盲进。不然更便于走错路。

  没有缩放的图像平滑仅扶助单通道图像,并且援助七个人到十六位的变换(与cvSobel和cvaplace相似)和三11个人浮点数到三1几位浮点数的变换格式。
  不难模糊和高斯模糊协助 1- 或 3-通道, 8-比特 和 32-比特
浮点图像。这二种方法可以(in-place)形式处理图像。
  中值和双向滤波工作于 1- 或 3-通道, 8-位图像,可是不可能以 in-place
格局处理图像。

 

从别处抄来的骨干代码:

看了一部分东西发现都挺坑的,然后看了看书,发现书上写的也。。。所以就把看书笔记,和跑动例程都来做贰个规整。

//邻域平均滤波
cvSmooth(pImg,pImg,CV_BLUR,3,3,0,0);        //3x3
cvSmooth(pImg,pImg,CV_BLUR,5,5,0,0);        //5x5
//中值滤波 
cvSmooth(pImg,pImg,CV_MEDIAN,3,3,0,0);      //3x3
cvSmooth(pImg,pImg,CV_MEDIAN,5,5,0,0);      //5x5
//高斯滤波
cvSmooth(pImg,pImg,CV_GAUSSIAN,3,3,0,0);    //3x3
cvSmooth(pImg,pImg,CV_GAUSSIAN,5,5,0,0);    //5x5

有关什么安插,是非同通常

自己要好抄来的三个总结例子:

故此布署写在了此间:http://www.cnblogs.com/letben/p/5278595.html

#include "stdafx.h"
#include <iostream>

#pragma comment(lib,"../OpenCV-2.4.8/lib/opencv_core248d.lib")
#pragma comment(lib,"../OpenCV-2.4.8/lib/opencv_highgui248d.lib")
#pragma comment(lib,"../OpenCV-2.4.8/lib/opencv_imgproc248d.lib")

#include "../OpenCV-2.4.8/include/highgui.h"
#include "../OpenCV-2.4.8/include/cv.h"

using namespace std;
using namespace cv;


int _tmain(int argc, char *argv[]) 
{
   IplImage* img = cvLoadImage("3.jpg") ;
   cvNamedWindow("DEMO-in") ;
   cvNamedWindow("DEMO-out") ;
   cvShowImage("DEMO-in",img) ;

   IplImage* out = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3) ;

   cvSmooth(img, out, CV_MEDIAN, 3, 3) ;

   cvShowImage("DEMO-out", out);

   cvReleaseImage( &out ) ;

   cvWaitKey( 0 ) ;
   cvDestroyWindow("DEMO-in") ;
   cvDestroyWindow("DEMO-out") ;

   return 0;
}

 

(2)OpenCV自带的人脸检查和测试
代码:

接下来是看书又看回到了那本学习opencv的茶青装帧书上。

#include "stdafx.h"
#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 
#include <math.h> 
#include <float.h> 
#include <limits.h> 
#include <time.h> 
#include <ctype.h>

#include <opencv2\opencv.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;

#ifdef _EiC 
#define WIN32 
#endif

static CvMemStorage* storage = 0; 
static CvHaarClassifierCascade* cascade = 0;

void detect_and_draw( IplImage* image );

const char* cascade_name = 
"haarcascade_frontalface_alt.xml"; 
/*    "haarcascade_profileface.xml";*/

int main( int argc, char** argv ) 
{ 
    cascade_name = "haarcascade_frontalface_alt.xml"; 
    cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); 

    if( !cascade ) 
    { 
        fprintf( stderr, "ERROR: Could not load classifier cascade\n" ); 
        return -1; 
    } 
    storage = cvCreateMemStorage(0); 
    cvNamedWindow( "result", 0 ); 

    const char* filename = "2.jpg"; 
    IplImage* image = cvLoadImage( filename, 1 );

    if( image ) 
    { 
        detect_and_draw( image ); 
        cvWaitKey(0); 
        cvReleaseImage( &image );   
    }

    cvDestroyWindow("result"); 

    return 0; 
}


void detect_and_draw(IplImage* img ) 
{ 
    double scale=1.2; 
    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}} 
    };//Just some pretty colors to draw with

    //Image Preparation 
    // 
    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); 
    cvCvtColor(img,gray, CV_BGR2GRAY); 
    cvResize(gray, small_img, CV_INTER_LINEAR);

    cvEqualizeHist(small_img,small_img); //直方图均衡

    //Detect objects if any 
    // 
    cvClearMemStorage(storage); 
    double t = (double)cvGetTickCount(); 
    CvSeq* objects = 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.) );

    //Loop through found objects and draw boxes around them 
    for(int i=0;i<(objects? objects->total:0);++i) 
    { 
        CvRect* r=(CvRect*)cvGetSeqElem(objects,i); 
        cvRectangle(img, cvPoint(r->x*scale,r->y*scale), cvPoint((r->x+r->width)*scale,(r->y+r->height)*scale), colors[i%8]); 
    } 
    for( int i = 0; i < (objects? objects->total : 0); i++ ) 
    { 
        CvRect* r = (CvRect*)cvGetSeqElem( objects, 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); 
}

初试牛刀——呈现图像

  
那其实是个Haar特征的级联分类器,haarcascade_frontalface_alt.xml这几个文件存的应当是正脸的Haar特征数据(预计的,没有深究过,欢迎拍砖指正),这几个文件是OpenCV自带的,使用的时候拷贝到本身的工程面即可。该数量被加载到static
CvHaarClassifierCascade* cascade变量,由detect_and_draw(IplImage*
img ) 函数里面包车型大巴cvHaarDetectObjects函数来贯彻人脸的检查和测试。

 

例2-1

#include "highgui.h"//1、

int main(int argc,char **argv){ //2、
    IplImage* img = cvLoadImage(argv[1]);//3、
    cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE);//4、
    cvShowImage("Example1", img);//5、
    cvWaitKey(0);//6、
    cvReleaseImage(&img);//7、
    cvDestroyWindow("Example1");//8、
}

 

 

一 、高级GUI图像用户界面,包罗媒体的输入输出,摄像捕捉,图像摄像的编解码,图形交互界面的接口。GUI:Graphical User Interface 图形用户界面(接口)

二 、这么些程序如故必要有一定的C++基础的,比如最起码要知道主函数是怎么的?怎么用本身记得从前在一片博文里面涉及过,第3个参数是,在命令行里面,到底键入了多少个字符组,第三个参数用来博取各个字符串的始末。关于详细能够看下那篇小说
http://www.cnblogs.com/letben/p/5229933.html 里面不难说了一下参数的场合

③ 、要是能精晓主函数的参数情况,那么在指令行里面键入 :opencv教程——显示图像 1.png 。在那之中第三个参数要想体现的话是:argv[0]如果cout<<argv[0]将会是“opencv教程——显示图像”,所以argv[1] 是 “1.png”所以上面一起也给了3个目录结构,为了能在当前目录里面找到1.png那张图纸。假使找到的话,就加载那张图片,并且把图像新闻赋给img。

肆 、成立贰个窗口,命名为“Example1”,关于大小是自适应内容大小的,相当于图像内容有多大,大家的窗口就建立多大,以刚好存放大家要来得的情节此时已窗口不可再转变。可选参数有0.当设置为0的时候,窗口大小能够拖动,相比适合我们一般选择照片查看器的习惯,那里须求读者尝试那多个参数

伍 、体现图片函数,把我们的img图片放到刚刚成立好的“Example1”里面

六 、等到用户操作,键入字母后,程序甘休。此参数大于0时,比如5000,指的是在6000纳秒后,程序甘休。小于等于0时期表等待用户操作。

七 、释放图片占用内部存款和储蓄器

⑧ 、释放窗口占用相关财富。

 365体育网址 1

命令行:

365体育网址 2

365体育网址 3

例2-2播放avi视频

#include "highgui.h"

int main(int argc,char **argv){

    cvNamedWindow("Example2", CV_WINDOW_AUTOSIZE);
    CvCapture* capture = cvCreateFileCapture(argv[1]);//1、
    IplImage* frame;//2、
    while (1){//3、
        frame = cvQueryFrame(capture);//单帧图像赋值,
        if (!frame) break;//如果单帧图像没有值,为真,就退出
        cvShowImage("Example2", frame);
        char c = cvWaitKey(33);//在33毫秒内等待用户输入 字符。
        if (c == 27) break;//如果该字符是 ESC-> 27 的话,就退出
    }
//8、
    cvReleaseCapture(&capture);
    cvDestroyWindow("Example2");

}

 

① 、同例1的“叁 、”一样,这些中是从用户输入的地点获得二个录制的靶子,因为是录像之所以接受格局不能够再是IplImage了,本次改成 指向CvCapture类型的 变量 capture,那是3个包装好的靶子,能够使用cvQueryFrame()获得单帧图像。

贰 、声Bellamy(Bellamy)个图形类型的变量

③ 、从录制对象里面得到的单帧图像传送给当下1个frame

④ 、假如frame为空就淡出

伍 、能进行到这里表明frame不为空,约等于足以显得把如今图像予以展示,

陆 、每张图片等候33阿秒,他能回来用户键入的字符,

七 、借使字符是键盘上的ESC的话,就退出。

 

⑧ 、释放 摄像窗口能源。

 

想一想:cvWaitKey()里面包车型大巴参数有如何用处?设置成一 、50、100来验证你的想法。

例2-3摄像播放控制

其实早先以为人家书写的挺好的。但是从那边就从头觉得坑了,不知晓是写的不咋地,依然翻译的可是细,总而言之开始蒙受了部分讲不通晓的点了。然后就协调节和测试,一贯到代码能跑。。。

接下来这里希望把能跑的代码分享出来,也总算对自个儿攻读进程的1个记录,在此之前都看过不少事物只是都忘了。。。现在始于养成记录的习惯,一旦本人忘了,能够回复看看,即便还是能够对人家有所帮忙,那就再好可是。

#include "cv.h"//1、
#include "highgui.h"

int g_slider_position = 0;//2、
CvCapture* g_capture = NULL;//3、这句话能通过需要 目录在 include下面。

void onTrackbarSlide(int pos){//4、
    cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);//5、
}
//如何实现反向的显示,就是 视频播放中,改变滚动条的位置。
int main(int argc,char** argv){

    cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE);
    g_capture = cvCreateFileCapture(argv[1]);
    int frames = (int)cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);//6、

    if (frames != 0){//7、
        cvCreateTrackbar("Position", "Example3", &g_slider_position, frames, onTrackbarSlide);
    }

    IplImage* frame;
    while (1){
        frame = cvQueryFrame(g_capture);
        if (!frame) break;
        cvShowImage("Example3", frame);
        char c = cvWaitKey(33);
        if (c == 27)break;

        //8、反向显示
        //g_slider_position = cvGetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES);
        //cvSetTrackbarPos("Position", "Example3", g_slider_position);

    }
    cvReleaseCapture(&g_capture);
    cvDestroyWindow("Example3");
}

① 、这一次蕴涵的头多了二个,那一个是opencv 第2个本子留下的精髓,与他协同留下来的还有别的1一个公文,那一个是内部最大的三个有4KB。别的的都是3KB还有三个是1KB【http://i.cnblogs.com/Files.aspx
能够到这一个里面下载MyLittleFindy,然后键入目录 以及cv.h 来探望那几个新闻。】

贰 、那几个是滑动地点,假如不举行反向展现,那个参数没有用。那也是自家起来不爱好那套教程的来由。

③ 、把它建议来是为了非主函数内可用,以为大家还有参数要使用那些 摄像捕捉
对象。

肆 、那是贰个函数,当大家双击这几个地点的时候,发现7里面,用了那些函数,不过利用办法跟大家此前的格局非常小一样。函数的应用相应被传送参数,然而那在那之中就唯有五个函数名,也便是当下函数的指针,那种艺术叫做
回调函数,即,把贰个函数的地点作为别的多个程序的参数字传送进来的主意。个中有五个剧中人物多少个是主调函数,别的叁个是回调函数。主调函数中有回调函数的函数名,回调函数正是大家常常意义上的一个函数,只然则当它的应用是以函数地址方式现身的时候,就被称为回调函数。参考

http://www.cnblogs.com/letben/p/5225521.html

以此里面 onTrackbarSlide
正是回调函数了。

⑤ 、设置摄像参数,第二个是象征当前摄像,CV_CAP_PROP_POS_FRAMES:有太多的不明白,就是其一不通晓,指的是:总结机视觉_视频_参数_位置_帧数,地点,地点是传递进入的参数

六 、这一行比较浅显:总帧数 =
计算机视觉获得录像参数(当前摄像,录像总帧数)

7、cvCreateTrackbar(“Position”, “Example3”, &g_slider_position,
frames, onTrackbarSlide);主调函数,由她调用回调函数 Position是控制条的名目,example3 是窗口的名目,控制条的开局地方,那里运用引用依旧相比实用的,frames是总帧数,函数地址。

捌 、由读者本人考虑,那怎么考虑那几个参数、函数都没有介绍啊。。。

 

例2-4 平滑处理

图像平滑:非凡图像的宽大区域、低频成分、主干部分或抑制图像噪声和干扰高频元素的图像处理办法,用以实现亮度平缓渐变,减小突变梯度,改良图像质量。常见的图像平滑法有一 、差值平滑方法;贰 、线性凉滑方法;③ 、卷积法等 方法的选料取决于噪声种类比如碰着椒盐噪声 可选拔线性温滑方法。

 

下一场是其一调用不了啊。。。

于是 就控制把它调用起来:

#include "highgui.h"
#include "cv.h"

using namespace std;

void example2_4(IplImage *img){

    cvNamedWindow("Example4-in");
    cvNamedWindow("Example4-out");
    cvShowImage("Example4-in",img);
    IplImage * out = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);//1、
    cvSmooth(img, out, CV_GAUSSIAN,1,31);//2、
    cvShowImage("Example4-out", out);
    cvReleaseImage(&out);
    cvWaitKey(0);
    cvDestroyAllWindows();
}


int main(int argc,char **argv){
    IplImage* img = cvLoadImage(argv[1]);
    example2_4(img);
}

方今的能够读了,默写三回,前边的就用已知凑就能够了,然后再有半点匈牙利(Hungary)语的底稿,最起码简单的单词像这种
release destroy smooth,然后前面包车型的士先后通晓起来就很不难了。

因而到了此处必要表达的相应就1跟2了。

壹 、创制图片,首先供给创立图片的图片大小,然后是图像的吃水音讯,那几个是陆人的。平常都以八位的,陆位刚好用来代表从0-255,刚好是用来代表颜色的分寸。rgb三色都以从0-255,0-255,0-255。接下来是3,3表示通道,rgb多少个通道,如果是灰度图的话是1.唯有黑白。rgb是多个颜色。所以是八个通道。那样那些out正是跟原图片相同大,深度为5人,三通道的图样底子。

2、cvSmooth(img, out,
CV_GAUSSIAN,1,31);总括机视觉平滑(输入的图纸,输出的图纸,选拔电脑视觉_高斯形式,横向模糊,纵向模糊);

经检查和测试那么些数值都只能是奇数。估算假诺模糊当前点的话,偶数点数非常,奇数的话,就能够满意当下点左右,上下。并不知道一个点是怎么处理的。那里书上给的是3,3

例2-5选取cvPryDown()创造一副宽度和可观为输入图像相似尺寸的图像

 

#include "highgui.h"
#include "cv.h"

IplImage* dopyrDown(IplImage* in,int filter = IPL_GAUSSIAN_5x5){

    assert(in->width % 2 == 0 && in->height % 2 == 0);
    IplImage* out = cvCreateImage(cvSize(in->width / 2, in->height / 2), in->depth, in->nChannels);
    cvPyrDown(in, out);
    return (out);

}

int main(int argc, char **argv){
    IplImage* img = cvLoadImage(argv[1]);
    cvNamedWindow("Example5-in");
    cvShowImage("Example5-in", img);
    IplImage* img1 = dopyrDown(img);

    cvNamedWindow("Example5");
    cvShowImage("Example5", img1);
    cvReleaseImage(&img1);

    cvWaitKey(0);
    cvDestroyAllWindows();
}

 

//多多使用 F12按键 和‘ctrl’+‘-’读作contrl 和减号。F12用来向下询问函数的注解大概定义,前边的组合键用以再次来到到上一层。

/*

   Smoothes the input image with gaussian kernel and then down-samples
it.

   dst_width = floor(src_width/2)[+1],

   dst_height = floor(src_height/2)[+1]

*/

下一场就发现那是向下模糊的章程,它用来将输入的图样应用高斯内核平滑,然后向下采集样品。

 

看样子她的孪生表妹:

/*

   Up-samples image and smoothes the result with gaussian kernel.

   dst_width = src_width*2,

   dst_height = src_height*2

*/

CVAPI(void)  cvPyrUp( const CvArr* src, CvArr* dst,

                      int filter CV_DEFAULT(CV_GAUSSIAN_5x5) );

品味运用这几个函数,让函数能跑起来。大家利用的doPryDown() 把原图缩减为四分之二,然后使用5*5的章程实行高斯模糊,以后接纳 doPryUp() 把原图扩展扩展1倍,然后实行模糊。

 

啊,那里assert忘了说了,正是一种硬设定,要求她是个如何什么样体统,那一个在junit里面看到过,用来开始展览单元测试。在那当中强硬令输入图片的宽和高均能被2整除,然后缩放才有含义

 

勤学苦练:新建三个doPryUp()函数达成上述意义。

勤学苦练答案:

IplImage* doPyrUp(IplImage* in, int filter = IPL_GAUSSIAN_5x5){

    IplImage* out = cvCreateImage(cvSize(in->width * 2, in->height * 2), in->depth, in->nChannels);
    cvPyrUp(in, out);
    return (out);

}

练习2-6

canny边缘检测将出口写入1个单通道(灰度级)图像

 

#include "highgui.h"
#include "cv.h"
using namespace std;

IplImage* doCanny(IplImage* in,double lowThresh,double highThresh,double aperture){
    assert(in->nChannels = 1);
    if (in->nChannels != 1){
        cout << in->nChannels << endl;
        cout << "不能输出" << endl;
        return 0;
    }
    IplImage* out = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1);//原书这里绝对有问题。
    cvCanny(in, out, lowThresh, highThresh, aperture);
    return out;


}
int main(int argc,char **argv){
    IplImage* img = cvLoadImage(argv[1]);
    cvNamedWindow("Example5");
    cvShowImage("Example5", img);

    IplImage* img1 = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
    cvConvertImage(img, img1, CV_BGR2GRAY);//这个在 cv.h 包里面
    IplImage* out = doCanny(img1, 10, 100, 3);
    cvNamedWindow("Example5-out");
    cvShowImage("Example5-out", out);
    cvReleaseImage(&out);
    cvWaitKey(0);
    cvDestroyAllWindows();

}

作者们早已基本熟识了那几个剧情,所以以往要从难点名称入手,来解决那个题材,正是报告您有1个canny能够做边缘检查和测试。

接下来把那一个canny敲出来,坐等它补全参数,或许先遵照书上的内容把参数补全,然后最珍视的是按F12跻身。

下一场您发觉了:

/****************************************************************************************\

*                                  Feature detection
                                    *

\****************************************************************************************/

 

/* Runs canny edge detector */

CVAPI(void)  cvCanny( const CvArr* image, CvArr* edges, double threshold1,

                      double threshold2, int  aperture_size
CV_DEFAULT(3) );

为此她们是用来做特征点检查和测试的,上面还有荒漠多的其他函数,那应该也是做特征点检查和测试的。先结合大家的事例知道那一个事物是干嘛的相比根本:

cvCanny(in, out, lowThresh, highThresh, aperture);

咱俩为了把那个函数跑起来,做了二个doCanny,以下函数注脚:

IplImage* doCanny(IplImage* in,double lowThresh,double
highThresh,double aperture)

out是用来输出的图片指针。

/*

输入了3个图片参数 和三个double类型的参数,具体的只怕要看看canny参数的落到实处过程。然后那一个就相比往下抠了:F:\opencv249\opencv\sources\modules\imgproc\src去那么些里面找到canny.cpp用个如何的打开之后就能够看人家怎么落到实处的了,然后就须要依靠一些文献,以搞清各类地点都以怎么用的。这一个实在正是算法,算法的指标便是检查和测试边缘,算法的落到实处正是那么些东西,要想看领会看文献。然后正是所谓的算法优化了,我就真特么操蛋,一进去某商家问您会算法么?是天葱数么?~照旧Mason素数?随便搞贰个小学生的数学题都亟待很强的算法才能做出来。消除的题材不雷同,难点的圈子不雷同,想难题的方法不同,要怎么才能把“会”字说出口?就跟问你会做饭一样么?好比你很会做饭了,可是未来要你去中中原人民共和国做饭,当然你会的是United States的各个几分熟牛排的做法,去了中中原人民共和国,生的倒霉吃,要不没味儿,要不吃不惯要不太硬了,要不咬不动,你觉得您还有被选拔的市场股票总值么?没有啊!你只会U.S.A.的那套做饭方式,中国没人吃,你这算法没人用。恐怕同一是边缘检测,算法优化的一种是从算法本人上优化,还有一种正是直接屏弃那种所谓的canny格局,间接换了法子。所以至于面试题你会不会算法,你能够算法优化么差不多特么的。对于那种题材不得不说要求时刻,并且笔者原先做过什么的算法达成了怎么样的优化。再牛逼的算法就须求灵感了。好了
作者就是突然想起来吐个槽。特么的。

 

既然如此来了那个canny里面那么肯定还有很多任何的检查和测试方法。能够使用其他的特征点检查和测试方法看看结果:小编见状了
cvCorner哈Rees 试试它是什么样利用的。哈哈
并没试出来,然而肯定是有方法弄的,或许是一些点不太符合规范,总而言之依旧要快一些询问任何框架,所以不用扣这么太细。

 

*/

 

canny供给输入图片时单通道的,并且只要不是就强行转换到单通道的assert(in->nChannels = 1);所以合理的不二法门是在输入的时候就给一个单通道的图样。

通过

IplImage* img1 = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);

始建图片,大小,深度消息六位,单通道。

cvConvertImage(img, img1, CV_BGR2GRAY);

把彩图转换来灰图。

接下来传入。

创建输出图片新闻。

IplImage* out = cvCreateImage(cvGetSize(in), IPL_DEPTH_8U, 1);

大小,深度,单通道

做canny传递参数,未来还不知晓这个参数是干什么用的,同理可得传对了先跑起来加以。

接下来看看效果,然后调参数看看每一种参数具体对应怎么样结果。

 

末尾那多少个相比较坑,感觉根本都没说精通。可是关于函数调用也不应该是在那边学的。优化,也不在那里展开了,往下看是从摄像机读入数据:

例2-9:

 

#include "highgui.h"

int main(int argc,char ** argv){

    CvCapture* capture;

    if (argc == 1){
        capture = cvCreateCameraCapture(0);
    }
    else{
        capture = cvCreateFileCapture(argv[1]);
    }

    assert(capture != NULL);
    cvNamedWindow("Example6", CV_WINDOW_AUTOSIZE);

    IplImage* frame;
    while (1){
        frame = cvQueryFrame(capture);//单帧图像赋值,
        if (!frame) break;//如果单帧图像没有值,为真,就退出
        cvShowImage("Example6", frame);
        char c = cvWaitKey(33);//在33毫秒内等待用户输入 字符。
        if (c == 27) break;//如果该字符是 ESC-> 27 的话,就退出

        //按住ESC是正确终止,按 ctrl+c的效果反而不大好。
    }
    cvReleaseCapture(&capture);
    cvDestroyWindow("Example6");

}

 

通过参数能够发现cvCreateCameraCaptrue(0)是开辟录像头

cvCreateFileCapture(路径)
是打开录制文件。

 

接下来是其一备受诟病的

例2-10一个完完全全的先后用来落到实处读入贰个五彩缤纷录制文件并以灰度格式输出那个摄像文件

自家出口了有些次都以三个很坑爹的。。。效果,初步对logpolar无感,越读越觉得polar是极点的意思,然后抄了2回之后,获得了2个结果,弹指间认为那个怎么特么的是极坐标啊。

因而要是标题是不易的:也正是读入贰个花团锦簇录像灰度输出的话:

#include "highgui.h"
#include "cv.h"

int main(int argc,char **argv){
    //得到视频
    CvCapture *capture = 0;
    capture = cvCreateFileCapture("F:\\opencv练习代码\\opencv教程7——写入avi文件\\Debug\\n.mp4");  //得到路径显示图像
    if (!capture)
        return -1;
//从capture里面得到每一帧的图像
    IplImage *bgr_frame = cvQueryFrame(capture);//通过视频得到图像
    double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);//帧率,就是一个函数用以得到视频的实行,这里面得到的是fps
/*什么是fps
http://baike.baidu.com/link?url=Z1KZNXGP-UB05rJOsom0bv-VDOYG2v6-dylVHBZ8Eo22Vy_klv6GdSo0H3SYfSD5hmCkM2hNQB0gdFmBlTvKM_
*/
    CvSize size = cvSize(
        (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH),
        (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT));
    CvVideoWriter *writer = cvCreateVideoWriter("D:\\b.avi", CV_FOURCC('M', 'J', 'P', 'G'), fps, size,0);//这里0是灰图,1是彩图。所以不写时候就按默认的1进行处理,然后再写彩图就写不出来。路径,编码格式,帧率,单张frame大小,按灰图输出。
    IplImage* logpolar_frame = cvCreateImage(size, IPL_DEPTH_8U, 1);

    while ((bgr_frame = cvQueryFrame(capture)) != NULL)
    {//这个写法还是比较经典的,在字符流的部分讲述比较多。

        cvCvtColor(bgr_frame,logpolar_frame,CV_BGR2GRAY);//转换成灰图

        cvWriteFrame(writer, logpolar_frame);//写入到输出文件

    }
//释放资源
    cvReleaseVideoWriter(&writer);
    cvReleaseImage(&logpolar_frame);
    cvReleaseCapture(&capture);

    return 0;

}

书上的代码应该是没错的。写出来是依照极坐标弄出来的扭转的录制文件。

 

习题:

或是这一个书的出现确实是首先版。因为尚未习题1的opencv.sln…

 

因此从第③题伊始做啊:

下一场找了半天,也没找到这么些 所谓的lkdemo.c,所以必然了那本书的产出时机应该是第③版本,并且没有持续优化,F:\opencv249\opencv\sources\samples\cpp在那个路子下边找到

lkdemo.cpp,然后打开复制全文,到vs贰零壹叁内部新建筑工程程,项目,粘贴,然后依照咱们那篇博文开篇地点的配制方法,配置包蕴目录,
库目录,链接器里面包车型地铁链接加载项,然后就好了。然后编写翻译,出现结果。

 

三 、4基本上是二个题了,依据大家日前默写的痛感,最起码要能自身把那几个注释写出来,自个儿写多个计算,然后三四题就能相比较简单的写出来了。

 

本条并不能缩放,应该是还有何点,没有分析透彻。恐怕是有如何函数不老聃楚。

第肆题并从未做出来。

#include "highgui.h"
#include "cv.h"

int main(int argc ,char **argv){

    CvCapture *capture = cvCreateCameraCapture(0);
    IplImage* frame;
    CvSize size = cvSize(
        (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH) / 2,
        (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT) / 2);
    CvVideoWriter* writer = cvCreateAVIWriter(argv[1], 6, 24, size);//后面还有一个参数,1是彩图,0是灰图。默认彩图
    cvNamedWindow("Example6", CV_WINDOW_AUTOSIZE);

    while (1){
        frame = cvQueryFrame(capture);
        cvWriteFrame(writer, frame);
        cvShowImage("Example6", frame);
        char c = cvWaitKey(33);//在33毫秒内等待用户输入 字符。事实上小于41.67都是流程的,
        if (c == 27) break;
    }

    cvReleaseVideoWriter(&writer);
    cvReleaseImage(&frame);
    cvDestroyAllWindows();
    //cvReleaseCapture(&g_capture);
    //感觉程序没有正常结束啊。
    //还好 总之视频是关掉了的。
    return 0;
}

 

 

 

相关文章