zoukankan      html  css  js  c++  java
  • 自己在总结前人经验下弄的几个opencv封装函数

    第一个是增加对比度的函数,就是变亮。

     1 IplImage* EqualizeHistColorImage(IplImage *pImage)
     2 {
     3     IplImage *pEquaImage = cvCreateImage(cvGetSize(pImage), pImage->depth, 3);
     4     
     5     // 原图像分成各通道后再均衡化,最后合并即彩色图像的直方图均衡化
     6     const int MAX_CHANNEL = 4;
     7     IplImage *pImageChannel[MAX_CHANNEL] = {NULL};
     8 
     9     int i;
    10     for (i = 0; i < pImage->nChannels; i++)
    11         pImageChannel[i] = cvCreateImage(cvGetSize(pImage), pImage->depth, 1);
    12 
    13     cvSplit(pImage, pImageChannel[0], pImageChannel[1], pImageChannel[2], pImageChannel[3]);//将传入图像的通道拆分,方便各个增亮
    14     
    15     for (i = 0; i < pImage->nChannels; i++)
    16         cvEqualizeHist(pImageChannel[i], pImageChannel[i]);//各个通道的像素增亮,此函数第一个是传入,第二个参数是传出
    17 
    18     cvMerge(pImageChannel[0], pImageChannel[1], pImageChannel[2], pImageChannel[3], pEquaImage);//将之前拆分后的各个通道的像素图片组合
    19 
    20     for (i = 0; i < pImage->nChannels; i++)
    21         cvReleaseImage(&pImageChannel[i]);//逐个释放内存
    22 
    23     return pEquaImage;//返回被处理过的图像
    24 }

    第二个是图像变黑白色,二值化和轮廓绘线。

     1 void ChangeTheColor(int pos,IplImage* g_pGrayImage,CvSeq* g_pcvSeq)
     2 {
     3     // 转为二值图,黑白图
     4     IplImage *pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);
     5     cvThreshold(g_pGrayImage, pBinaryImage, pos, 255, CV_THRESH_BINARY);
     6     //第一个参数表示输入图像,必须为单通道灰度图。
     7     //第二个参数表示输出的边缘图像,为单通道黑白图。
     8     //第三个参数表示阈值,黑白色的范围
     9     //第四个参数表示最大值。
    10     //第五个参数表示运算方法。
    11 
    12     // 显示二值图
    13     cvShowImage("xxx", pBinaryImage);
    14 
    15 
    16     CvMemStorage *pcvMStorage = cvCreateMemStorage();
    17     double fRho = 1;
    18     double fTheta = CV_PI / 180;
    19     int nMaxLineNumber = 500;   //最多检测条直线
    20     double fMinLineLen = 50;   //最小线段长度
    21     double fMinLineGap = 20;   //最小线段间隔
    22     CvSeq *pcvSeqLines = cvHoughLines2(pBinaryImage, pcvMStorage, CV_HOUGH_PROBABILISTIC, fRho, fTheta, nMaxLineNumber, fMinLineLen, fMinLineGap);
    23 
    24 
    25     IplImage *pColorImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 3);
    26     cvCvtColor(pBinaryImage, pColorImage, CV_GRAY2BGR);
    27     int i;
    28     for(i = 0; i < pcvSeqLines->total; i++)    {
    29         CvPoint* line = (CvPoint*)cvGetSeqElem(pcvSeqLines, i);
    30         cvLine(pColorImage, line[0], line[1], CV_RGB(255,0,0), 2);
    31     }
    32 
    33     
    34     cvShowImage("qq", pColorImage);
    35 
    36     CvMemStorage* cvMStorage = cvCreateMemStorage();
    37     // 检索轮廓并返回检测到的轮廓的个数
    38     cvFindContours(pBinaryImage,cvMStorage, &g_pcvSeq,sizeof(CvContour),2);//这个要和cvDrawContrours连用
    39     //cvFindContours
    40     //函数功能:对图像进行轮廓检测,这个函数将生成一条链表以保存检测出的各个轮廓信息,并传出指向这条链表表头的指针。
    41     //第一个参数:输入的图像
    42     //第二个参数:内存容器
    43     //第三个参数:存输出信息的参数
    44     //4.5.6略
    45 
    46     IplImage *pOutlineImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 3);
    47     int _levels = 5;
    48     cvZero(pOutlineImage);
    49     cvDrawContours(pOutlineImage, g_pcvSeq, CV_RGB(255,0,0), CV_RGB(0,255,0), _levels);
    50     //第一个参数表示输入图像,函数将在这张图像上绘制轮廓。
    51     //第二个参数表示指向轮廓链表的指针。
    52     //第三个参数和第四个参数表示颜色,绘制时会根据轮廓的层次来交替使用这二种颜色。255,0,0->红,0,255,0->绿,0,0,255蓝
    53     //第五个参数表示绘制轮廓的最大层数,如果是0,只绘制contour;如果是1,追加绘制和contour同层的所有轮廓;
    54     //如果是2,追加绘制比contour低一层的轮廓,以此类推;如果值是负值,则函数并不绘制contour后的轮廓,但是将画出其子轮廓,一直到abs(max_level) - 1层。
    55     //第六个参数表示轮廓线的宽度,如果为CV_FILLED则会填充轮廓内部。
    56     //第七个参数表示轮廓线的类型。
    57     //第八个参数表示偏移量,如果传入(10,20),那绘制将从图像的(10,20)处开始。
    58     cvShowImage("qqqq", pOutlineImage);
    59     
    60     cvReleaseImage(&pColorImage);
    61     cvReleaseMemStorage(&cvMStorage);
    62     cvReleaseImage(&pBinaryImage);
    63     cvReleaseImage(&pOutlineImage);
    64 }

    第三个是三通道图片的像素全访问,可以自己通过改变像素值来改变图像颜色。

     1 oid visit_image(IplImage* Image){
     2     const char * name="913337456";
     3     cvNamedWindow(name,1);
     4     uchar* data=(uchar *)Image->imageData;
     5     int step = Image->widthStep/sizeof(uchar);
     6     int channels = Image->nChannels;
     7     for(int i=0;i<Image->height;i++){
     8        for(int j=0;j<Image->width;j++){
     9            data[i*step+j*channels+0]=1;//通道1,我这里全改了1
    10            data[i*step+j*channels+1]=2;//不赋值就没改变
    11            data[i*step+j*channels+2]=3;
    12        }
    13     }
    14     cvShowImage(name,Image);
    15     cvWaitKey(0);
    16     cvReleaseImage(&Image);
    17     cvDestroyWindow(name);
    18 }

    第四个是从两张图片中找到不同处,并以第三张图输出。可以说是大家来找茬的外挂代码。

     1 void Get_The_Different_From_The_Cctv(IplImage* image1,IplImage* image2){
     2     IplImage* image_1=cvCreateImage(cvSize(image1->width,image1->height),IPL_DEPTH_8U,1);
     3     IplImage* image_2=cvCreateImage(cvSize(image1->width,image1->height),IPL_DEPTH_8U,1);
     4     IplImage* image_and=cvCreateImage(cvSize(image1->width,image1->height),IPL_DEPTH_8U,1);
     5     cvCvtColor(image1,image_1,CV_BGR2GRAY);
     6     cvCvtColor(image2,image_2,CV_BGR2GRAY);
     7     cvAbsDiff(image_1,image_2,image_and);
     8     cvNamedWindow("nimad",1);
     9     cvShowImage("nimad",image_and);
    10     cvWaitKey(0);
    11     cvDestroyWindow("nimad");
    12     cvReleaseImage(&image_and);
    13 }

         正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我。

  • 相关阅读:
    Codeforces Round #362 (Div. 2) C
    poj1655 树重心
    poj1985 树直径
    Codeforces Round #403 (based on Technocup 2017 Finals)
    uva 10054 The necklacr
    bfs codeforces 754B Ilya and tic-tac-toe game
    矩阵快速幂专题
    CodeForces 863E Turn Off The TV 思维,扫描线
    CodeForces 803F Coprime Subsequences 莫比乌斯,容斥
    CodeForces 803C Maximal GCD 思维
  • 原文地址:https://www.cnblogs.com/linguanh/p/4267464.html
Copyright © 2011-2022 走看看