第一个是增加对比度的函数,就是变亮。
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 }
正在看本人博客的这位童鞋,我看你气度不凡,谈吐间隐隐有王者之气,日后必有一番作为!旁边有“推荐”二字,你就顺手把它点了吧,相得准,我分文不收;相不准,你也好回来找我。