博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自己在总结前人经验下弄的几个opencv封装函数
阅读量:7123 次
发布时间:2019-06-28

本文共 4916 字,大约阅读时间需要 16 分钟。

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

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     //cvFindContours40     //函数功能:对图像进行轮廓检测,这个函数将生成一条链表以保存检测出的各个轮廓信息,并传出指向这条链表表头的指针。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
height;i++){ 8 for(int j=0;j
width;j++){ 9 data[i*step+j*channels+0]=1;//通道1,我这里全改了110 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 }

 

 

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

转载于:https://www.cnblogs.com/linguanh/p/4267464.html

你可能感兴趣的文章
git squash 和 git rebase
查看>>
使用Cyclone IV控制DDR2
查看>>
[Spring MVC] - 地址路由使用(一)
查看>>
线程互斥与析构函数中mutex的销毁
查看>>
[Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.2.7
查看>>
复习下C 链表操作(单向链表)
查看>>
栈结构的经典算法题
查看>>
Contoso 大学 - 7 – 处理并发
查看>>
好命的姑娘?命运取决于你现在在干什么!
查看>>
atitit.GUI图片非规则按钮跟动态图片切换的实现模式总结java .net c# c++ web html js...
查看>>
分享一下spark streaming与flume集成的scala代码。
查看>>
关于HOSTS设置不生效的解决小方法
查看>>
无法打开物理文件mdf,操作系统错误 5:&quot;5(拒绝訪问。)&quot;
查看>>
Dynamic CRM 2013学习笔记(二十三)CRM JS智能提示(CRM 相关的方法、属性以及页面字段),及发布前调试...
查看>>
ecside使用笔记(1)
查看>>
eclipse+webservice开发实例
查看>>
js undefined易错分析
查看>>
程序员必须知道的几个Git代码托管平台(转)
查看>>
PHP 二维数组根据相同的值进行合并
查看>>
微信JS-SDK使用权限签名算法的服务端实现(.net版本)
查看>>