qt下OpenCV编程例子笔记一

来源:互联网 发布:windows内核 编辑:程序博客网 时间:2024/05/22 11:53

以下所有例子来源于http://wiki.opencv.org.cn

一、读入图片显示

#include "cv.h"#include "cxcore.h"#include "highgui.h"#if 1using namespace cv;int main() {    //声明IplImage指针    IplImage* pImg;    //载入图片    pImg=cvLoadImage("../Lena.jpg",CV_LOAD_IMAGE_COLOR);  //C:\2.jpg 要使用'/' 而不是windows的 '\'    if(NULL==pImg)    {        printf("image can't read!\n");        return -1;    }   // Mat image(pImg); //有这句话,为什么会出错    //创建窗口    //cvNamedWindow("Image",CV_WINDOW_AUTOSIZE);  // 为什么注释掉这句话,程序尼玛也运行    //显示图像    cvShowImage("Image",pImg);    //等待按键    cvWaitKey(0);    //销毁窗口    cvDestroyWindow("Image");    //释放图像    cvReleaseImage(&pImg);     // 为什么我把这条语句放在cvWaitKey前面时,窗口任然有图像显示,放在cvShowImage前面时才没有图片显示    return 0;}#else    #if 0    using namespace cv; //下面函数要cv前缀    int main()    {        Mat image;        image=imread("C:/2.jpg");        imshow("li",image);        waitKey();        return 0;    }    #else    using namespace cv;//下面的所有cv相关类型不用加上前缀了,这里的前缀为cv::    int main(int argc, char* argv[])    {        Mat img = imread("Lena.jpg"); //声明Mat变量并调入lena的照片,图片放在工程目录中直接使用"Lena.jpg"不行,要把图片放在工程目录的上一层        //然后使用../Lena.jpg,对于使用vs的这使用..\\Lena.jpg,第一个\为转义字符        if(!img.data) //判断图片调入是否成功             return -1; //调入图片失败则退出        //创建窗口,并确定其为大小不可变类型窗口        namedWindow("loveLena", CV_WINDOW_AUTOSIZE);        //显示图片。如果你不介意窗口大小可变,可以直接注释掉上一句。因为imshow可以直接创建窗口        imshow("loveLena", img);        waitKey(); //等待按键        return 0;}    #endif#endif

二、图像创建、保存和复制

最终在工程目录上一级目录中生成copy.jpg

#include "cv.h"#include "highgui.h"int main( int argc, char** argv ){    IplImage* pImg; //声明IplImage指针    //载入图像,强制转化为Gray    pImg = cvLoadImage("../Lena.jpg", 0);    if(pImg != NULL )    {      IplImage* pImg2 = cvCreateImage(cvGetSize(pImg),                      pImg->depth,                      pImg->nChannels);      cvCopy(pImg, pImg2, NULL);      cvSaveImage("../copy.jpg", pImg2);//把图像写入文件      cvNamedWindow( "Image", 1 );//创建窗口      cvShowImage( "Image", pImg );//显示图像      cvWaitKey(0); //等待按键      cvDestroyWindow( "Image" );//销毁窗口      cvReleaseImage( &pImg ); //释放图像      cvReleaseImage( &pImg2 ); //释放图像      return 0;    }  return -1;}

三、canny边缘检测

重点函数:

cvCanny(pImg, pCannyImg, 50, 150, 3);

#include "cv.h"#include "cxcore.h"#include "highgui.h"int main( int argc, char** argv ){  //声明IplImage指针  IplImage* pImg = NULL;  IplImage* pCannyImg = NULL;  //载入图像,强制转化为Gray  pImg = cvLoadImage("../Lena.jpg", 0);  if(pImg != NULL )    {      //为canny边缘图像申请空间      pCannyImg = cvCreateImage(cvGetSize(pImg),                      IPL_DEPTH_8U,                      1);      //canny边缘检测      cvCanny(pImg, pCannyImg, 50, 150, 3);      //创建窗口      cvNamedWindow("src", 1);      cvNamedWindow("canny",1);      //显示图像      cvShowImage( "src", pImg );      cvShowImage( "canny", pCannyImg );      cvWaitKey(0); //等待按键      //销毁窗口      cvDestroyWindow( "src" );      cvDestroyWindow( "canny" );      //释放图像      cvReleaseImage( &pImg );      cvReleaseImage( &pCannyImg );      return 0;    }  return -1;}

四、轮廓(contour)检测

#ifdef _CH_#pragma package <opencv>#endif#ifndef _EiC#include "cv.h"#include "cxcore.h"#include "highgui.h"#include <math.h>#endif#define w 500int levels = 3;CvSeq* contours = 0;void on_trackbar(int pos){    IplImage* cnt_img = cvCreateImage( cvSize(w,w), 8, 3 );    CvSeq* _contours = contours;    int _levels = levels - 3;    if( _levels <= 0 ) // get to the nearest face to make it look more funny    _contours = _contours->h_next->h_next->h_next;    cvZero( cnt_img );    cvDrawContours( cnt_img, _contours, CV_RGB(255,0,0), CV_RGB(0,255,0), _levels, 3, CV_AA, cvPoint(0,0) );    cvShowImage( "contours", cnt_img );    cvReleaseImage( &cnt_img );}int main( int argc, char** argv ){    int i, j;    CvMemStorage* storage = cvCreateMemStorage(0);    IplImage* img = cvCreateImage( cvSize(w,w), 8, 1 );    cvZero( img );    for( i=0; i < 6; i++ )    {        int dx = (i%2)*250 - 30;        int dy = (i/2)*150;        CvScalar white = cvRealScalar(255);        CvScalar black = cvRealScalar(0);        if( i == 0 )        {            for( j = 0; j <= 10; j++ )            {                double angle = (j+5)*CV_PI/21;                cvLine(img, cvPoint(cvRound(dx+100+j*10-80*cos(angle)),                cvRound(dy+100-90*sin(angle))),                cvPoint(cvRound(dx+100+j*10-30*cos(angle)),                cvRound(dy+100-30*sin(angle))), white, 1, 8, 0);            }        }        cvEllipse( img, cvPoint(dx+150, dy+100), cvSize(100,70), 0, 0, 360, white, -1, 8, 0 );        cvEllipse( img, cvPoint(dx+115, dy+70), cvSize(30,20), 0, 0, 360, black, -1, 8, 0 );        cvEllipse( img, cvPoint(dx+185, dy+70), cvSize(30,20), 0, 0, 360, black, -1, 8, 0 );        cvEllipse( img, cvPoint(dx+115, dy+70), cvSize(15,15), 0, 0, 360, white, -1, 8, 0 );        cvEllipse( img, cvPoint(dx+185, dy+70), cvSize(15,15), 0, 0, 360, white, -1, 8, 0 );        cvEllipse( img, cvPoint(dx+115, dy+70), cvSize(5,5), 0, 0, 360, black, -1, 8, 0 );        cvEllipse( img, cvPoint(dx+185, dy+70), cvSize(5,5), 0, 0, 360, black, -1, 8, 0 );        cvEllipse( img, cvPoint(dx+150, dy+100), cvSize(10,5), 0, 0, 360, black, -1, 8, 0 );        cvEllipse( img, cvPoint(dx+150, dy+150), cvSize(40,10), 0, 0, 360, black, -1, 8, 0 );        cvEllipse( img, cvPoint(dx+27, dy+100), cvSize(20,35), 0, 0, 360, white, -1, 8, 0 );        cvEllipse( img, cvPoint(dx+273, dy+100), cvSize(20,35), 0, 0, 360, white, -1, 8, 0 );    }    cvNamedWindow( "image", 1 );    cvShowImage( "image", img );    cvFindContours( img, storage, &contours, sizeof(CvContour),                    CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );    // comment this out if you do not want approximation    contours = cvApproxPoly( contours, sizeof(CvContour), storage, CV_POLY_APPROX_DP, 3, 1 );    cvNamedWindow( "contours", 1 );    cvCreateTrackbar( "levels+3", "contours", &levels, 7, on_trackbar );    on_trackbar(0);    cvWaitKey(0);    cvReleaseMemStorage( &storage );    cvReleaseImage( &img );    return 0;}#ifdef _EiCmain(1,"");#endif

五、图像旋转与缩放

//按Esc键退出#include "cv.h"#include "highgui.h"#include "math.h"int main (int argc, char **argv){  IplImage *src = 0;  IplImage *dst = 0;  /* the first command line parameter must be image file name */  src = cvLoadImage("../Lena.jpg", -1);  if (src != 0)    {      int delta = 1;      int angle = 0;      int opt = 0;// 1: 旋转加缩放                        // 0:  仅仅旋转      double factor;      dst = cvCloneImage (src);      cvNamedWindow ("src", 1);      cvShowImage ("src", src);        for (;;)        {          float m[6];          // Matrix m looks like:          //          // [ m0  m1  m2 ] ===>  [ A11  A12   b1 ]          // [ m3  m4  m5 ]       [ A21  A22   b2 ]          //          CvMat M = cvMat (2, 3, CV_32F, m);          int w = src->width;          int h = src->height;          if (opt)// 旋转加缩放            factor = (cos (angle * CV_PI / 180.) + 1.0) * 2;          else//  仅仅旋转            factor = 1;          m[0] = (float) (factor * cos (-angle * 2 * CV_PI / 180.));          m[1] = (float) (factor * sin (-angle * 2 * CV_PI / 180.));          m[3] = -m[1];          m[4] = m[0];          // 将旋转中心移至图像中间          m[2] = w * 0.5f;          m[5] = h * 0.5f;          //  dst(x,y) = A * src(x,y) + b          cvZero (dst);          cvGetQuadrangleSubPix (src, dst, &M);          cvNamedWindow ("dst", 1);          cvShowImage ("dst", dst);          if (cvWaitKey (1) == 27)//ESC            break;          angle = (int) (angle + delta) % 360;        }// for-loop    }  return 0;}

六、读入视频文件及运动物体检测

#include <stdio.h>#include <cv.h>#include <cxcore.h>#include <highgui.h>int main( int argc, char** argv ){  //声明IplImage指针  IplImage* pFrame = NULL;  IplImage* pFrImg = NULL;  IplImage* pBkImg = NULL;  CvMat* pFrameMat = NULL;  CvMat* pFrMat = NULL;  CvMat* pBkMat = NULL;  CvCapture* pCapture = NULL;  int nFrmNum = 0;  //创建窗口  cvNamedWindow("video", 1);  cvNamedWindow("background",1);  cvNamedWindow("foreground",1);  //使窗口有序排列  cvMoveWindow("video", 30, 0);  cvMoveWindow("background", 360, 0);  cvMoveWindow("foreground", 690, 0); /*  if( argc > 2 )    {      fprintf(stderr, "Usage: bkgrd [video_file_name]\n");      return -1;    } */  //打开摄像头 // if (argc ==1)    if( !(pCapture = cvCaptureFromCAM(-1)))      {        fprintf(stderr, "Can not open camera.\n");        return -2;      }  //打开视频文件  /*  if(argc == 2)    if( !(pCapture = cvCaptureFromFile(argv[1])))      {        fprintf(stderr, "Can not open video file %s\n", argv[1]);        return -2;      } */  //逐帧读取视频  while(pFrame = cvQueryFrame( pCapture ))    {        nFrmNum++;        //如果是第一帧,需要申请内存,并初始化        if(nFrmNum == 1)        {          pBkImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1);          pFrImg = cvCreateImage(cvSize(pFrame->width, pFrame->height),  IPL_DEPTH_8U,1);          pBkMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);          pFrMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);          pFrameMat = cvCreateMat(pFrame->height, pFrame->width, CV_32FC1);          //转化成单通道图像再处理          cvCvtColor(pFrame, pBkImg, CV_BGR2GRAY);          cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);          cvConvert(pFrImg, pFrameMat);          cvConvert(pFrImg, pFrMat);          cvConvert(pFrImg, pBkMat);        }        else        {          cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);          cvConvert(pFrImg, pFrameMat);          //高斯滤波先,以平滑图像          //cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0);          //当前帧跟背景图相减          cvAbsDiff(pFrameMat, pBkMat, pFrMat);          //二值化前景图          cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);          //进行形态学滤波,去掉噪音          //cvErode(pFrImg, pFrImg, 0, 1);          //cvDilate(pFrImg, pFrImg, 0, 1);          //更新背景          cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);          //将背景转化为图像格式,用以显示          cvConvert(pBkMat, pBkImg);          //显示图像          cvShowImage("video", pFrame);          cvShowImage("background", pBkImg);          cvShowImage("foreground", pFrImg);          //如果有按键事件,则跳出循环          //此等待也为cvShowImage函数提供时间完成显示          //等待时间可以根据CPU速度调整          if( cvWaitKey(2) >= 0 )            break;        }    }  //销毁窗口  cvDestroyWindow("video");  cvDestroyWindow("background");  cvDestroyWindow("foreground");  //释放图像和矩阵  cvReleaseImage(&pFrImg);  cvReleaseImage(&pBkImg);  cvReleaseMat(&pFrameMat);  cvReleaseMat(&pFrMat);  cvReleaseMat(&pBkMat);  cvReleaseCapture(&pCapture);  return 0;}


七、Hougn线段检测

/* This is a standalone program. Pass an image name as a first parameter of the program.   Switch between standard and probabilistic Hough transform by changing "#if 1" to "#if 0" and back */#include <cv.h>#include <highgui.h>#include <math.h>int main(int argc, char** argv){    const char* filename = "../hough.png";    IplImage* src = cvLoadImage( filename, 0 );    IplImage* dst;    IplImage* color_dst;    CvMemStorage* storage = cvCreateMemStorage(0);    CvSeq* lines = 0;    int i;    if( !src )        return -1;    dst = cvCreateImage( cvGetSize(src), 8, 1 );    color_dst = cvCreateImage( cvGetSize(src), 8, 3 );    cvCanny( src, dst, 50, 200, 3 );    cvCvtColor( dst, color_dst, CV_GRAY2BGR );#if 0    lines = cvHoughLines2( dst, storage, CV_HOUGH_STANDARD, 1, CV_PI/180, 100, 0, 0 );  // 标准型    for( i = 0; i < MIN(lines->total,100); i++ )    {        float* line = (float*)cvGetSeqElem(lines,i);        float rho = line[0];        float theta = line[1];        CvPoint pt1, pt2;        double a = cos(theta), b = sin(theta);        double x0 = a*rho, y0 = b*rho;        pt1.x = cvRound(x0 + 1000*(-b));        pt1.y = cvRound(y0 + 1000*(a));        pt2.x = cvRound(x0 - 1000*(-b));        pt2.y = cvRound(y0 - 1000*(a));        cvLine( color_dst, pt1, pt2, CV_RGB(255,0,0), 3, CV_AA, 0 );    }#else    lines = cvHoughLines2( dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 50, 50, 10 ); //概率性    for( i = 0; i < lines->total; i++ )    {        CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);        cvLine( color_dst, line[0], line[1], CV_RGB(255,0,0), 3, CV_AA, 0 );    }#endif    cvNamedWindow( "Source", 1 );    cvShowImage( "Source", src );    cvNamedWindow( "Hough", 1 );    cvShowImage( "Hough", color_dst );    cvWaitKey(0);    return 0;}

八、鼠标绘图

#ifdef _CH_#pragma package <opencv>#endif#include "cv.h"#include "highgui.h"#include <stdio.h>#include <stdlib.h>IplImage* inpaint_mask = 0;IplImage* img0 = 0, *img = 0, *inpainted = 0;CvPoint prev_pt = {-1,-1};void on_mouse( int event, int x, int y, int flags, void* zhang){    if( !img )        return;    if( event == CV_EVENT_LBUTTONUP || !(flags & CV_EVENT_FLAG_LBUTTON) )        prev_pt = cvPoint(-1,-1);    else if( event == CV_EVENT_LBUTTONDOWN )        prev_pt = cvPoint(x,y);    else if( event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON) )    {        CvPoint pt = cvPoint(x,y);        if( prev_pt.x < 0 )            prev_pt = pt;        cvLine( inpaint_mask, prev_pt, pt, cvScalarAll(255), 5, 8, 0 );        cvLine( img, prev_pt, pt, cvScalarAll(255), 5, 8, 0 );        prev_pt = pt;        cvShowImage( "image", img );    }}int main( int argc, char** argv ){    char* filename = argc >= 2 ? argv[1] : (char*)"../Fruits.jpg";    if( (img0 = cvLoadImage(filename,-1)) == 0 )        return 0;    printf( "Hot keys: \n"            "\tESC - quit the program\n"            "\tr - restore the original image\n"            "\ti or ENTER - run inpainting algorithm\n"            "\t\t(before running it, paint something on the image)\n" );    cvNamedWindow( "image", 1 );    img = cvCloneImage( img0 );    inpainted = cvCloneImage( img0 );    inpaint_mask = cvCreateImage( cvGetSize(img), 8, 1 );    cvZero( inpaint_mask );    cvZero( inpainted );    cvShowImage( "image", img );    cvShowImage( "watershed transform", inpainted );    cvSetMouseCallback( "image", on_mouse, 0 );    for(;;)    {        int c = cvWaitKey(0);        if( (char)c == 27 )            break;        if( (char)c == 'r' )        {            cvZero( inpaint_mask );            cvCopy( img0, img,0 );            cvShowImage( "image", img );        }        if( (char)c == 'i' || (char)c == '\n' )        {            cvNamedWindow( "inpainted image", 1 );            cvInpaint( img, inpaint_mask, inpainted, 3, CV_INPAINT_TELEA );            cvShowImage( "inpainted image", inpainted );        }    }    return 1;}


九、Yml文件读取与写入

/*********************************************************************** * OpenCV 2.1 example ***********************************************************************/#include "cv.h"#include "highgui.h"#include <iostream>using namespace cv; //下面的所有cv相关类型不用加上前缀了using namespace std;int main(int argc, char* argv[]){    FileStorage fs("../test.yml", FileStorage::WRITE); //写的形式打开yml。当然也可以打开xml,主要看后缀    fs << "i" << 5 << "r" << 3.1 << "str" << "ABCDEFGH"; //存入整型、浮点型、字符串    Mat writeInImg = imread( "../lena.jpg" ); //载入Lena妞的图片载入    imshow( "Lena_from_jpg", writeInImg ); //看一看Lena妞是否健在    fs << "lena" << writeInImg; //将Lena妞的图片矩阵插入test.yml    fs.release();    FileStorage readfs("test.yml", FileStorage::READ); //读的形式打开yml。当然也可以打开xml,主要看后缀    if(readfs.isOpened() )    {        int i1 = (int)readfs["i"];        double r1 = (double)readfs["r"];        string str1 = (string)readfs["str"];        Mat readOutImg;        readfs["lena"] >> readOutImg; //把Lena从yml中取出        imshow( "Lena_from_yml", readOutImg ); //看看是不是跟之前放进去的是同一个人        std::cout<<"read out i:"<<i1<<std::endl<<"read out r:"<<r1<<std::endl<<"read out str:"<<str1<<std::endl;    }    readfs.release();    waitKey();    return 0;}


0 0