自己在总结前人经验下弄的几个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 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏林德熙的博客

Latex 公式速查

所有的在 Latex 使用的字符公式,都需要放在\(和\),$ 和 $,\begin{math} 和\end{math}之间。

2733
来自专栏大数据挖掘DT机器学习

用R语言做数据清理(详细教程)

数据的清理 如同列夫托尔斯泰所说的那样:“幸福的家庭都是相似的,不幸的家庭各有各的不幸”,糟糕的恶心的数据各有各的糟糕之处,好的数据集都是相似的。一份好的,干净...

6535
来自专栏崔庆才的专栏

TensorFlow验证码识别

本节我们来用 TensorFlow 来实现一个深度学习模型,用来实现验证码识别的过程,这里我们识别的验证码是图形验证码,首先我们会用标注好的数据来训练一个模型,...

4036
来自专栏MelonTeam专栏

图像处理之漫水填充算法(flood fill algorithm)

导语 介绍了漫水填充算法(flood fill algorithm)的基本思想,实现方式和应用场景,OpenCV中floodFill函数的使用方法。 ...

5489
来自专栏一棹烟波

OpenCV角点检测源代码分析(Harris和ShiTomasi角点)

OpenCV中常用的角点检测为Harris角点和ShiTomasi角点。 以OpenCV源代码文件 .\opencv\sources\samples\cpp\t...

4956
来自专栏IT杂记

根据两经纬度点计算距离公式推导

已知地球上的点E经纬度为(J1, W1),点F经纬度为(J2, W2),求两点间最短的球面距离。

2949
来自专栏小小挖掘机

Matplotlib基础全攻略

Matplotlib是Python中最流行的绘图库,它模仿MATLAB中的绘图风格,提供了一整套与MATLAB相似的绘图API,通过API,我们可以轻松地绘制出...

3605
来自专栏一棹烟波

OpenGL+OpenCV实现立方体贴图

我屮艸芔茻,转眼就7月份了。 今天试了一下立方体贴图,比较简单,大概说下和平面贴图的区别。 1. 平面贴图需要的是纹理坐标vec2;立方体贴图需要的是一个方向向...

2195
来自专栏图形学与OpenGL

7.5.5编程实例-Bezier曲线曲面绘制

      (a)Bezier曲线                         (b) Bezier曲面

1292
来自专栏专知

【论文推荐】最新7篇变分自编码器(VAE)相关论文—汉语诗歌、生成模型、跨模态、MR图像重建、机器翻译、推断、合成人脸

【导读】专知内容组整理了最近七篇变分自编码器(Variational Autoencoders)相关文章,为大家进行介绍,欢迎查看! 1. Generating...

5484

扫码关注云+社区