opencv

来源:互联网 发布:足彩软件哪个好 编辑:程序博客网 时间:2024/05/29 19:45

1.反转图像

函数:cv::flip()

[cpp] view plain copy
  1. void flip(InputArray src, OutputArray dst, int flipCode);  

参数fipCode: 整数,水平发转;0垂直反转;负数,水平垂直均反转。

2.sobel边缘检测

函数:cv::sobel()

例程:

[html] view plain copy
  1. //从文件中读入图像  
  2. const char* imagename = "lena.BMP";  
  3. Mat img = imread(imagename);  
  4. if(img.empty()) //如果读入图像失败  
  5. {  
  6.     fprintf(stderr, "Can not load image %s\n", imagename);  
  7.     return -1;  
  8. }  
  9.   
  10. namedWindow("original image");  
  11. imshow("original image",img);  
  12.   
  13.   
  14. //Mat result;  
  15. //flip(img, result, -1);    //反转图像  
  16. Mat sobelX, sobelY, sobel;  
  17. Sobel(img, sobelX, CV_16S, 1, 0);  
  18. Sobel(img, sobelY, CV_16S, 0, 1);  
  19. sobel = abs(sobelX) + abs(sobelY);  
  20.   
  21. //搜索sobel极大值  
  22. double sobmin, sobmax;  
  23. minMaxLoc(sobel, &sobmin, &sobmax);  
  24.   
  25. //变换为8位图像  
  26. //sobelImage = -alpha*sobel + 255  
  27. Mat sobelImage;  
  28. sobel.convertTo(sobelImage, CV_8U, -255./sobmax, 255);  
  29.   
  30. namedWindow("sobelImage");  
  31. imshow("sobelImage", sobelImage);  
  32.   
  33. Mat sobelThresholded;  
  34. double threadVal = 200;   
  35. threshold(sobelImage, sobelThresholded, threadVal, 255, THRESH_BINARY);  
  36.   
  37. namedWindow("sobelThresholded");  
  38. imshow("sobelThresholded", sobelThresholded);  

3. 读取单通道灰度图像

[cpp] view plain copy
  1. Mat img = imread("lena.bmp", 0);  
  2. imshow("lena", img);  
建立的img是单通道的。

4. 中值滤波

[cpp] view plain copy
  1. CvImgProc cvImgProc;  
  2.   
  3. Mat img = imread("lena.bmp", 0); //读取图像  
  4. namedWindow("lena", CV_WINDOW_AUTOSIZE);  
  5. imshow("lena", img);  
  6.   
  7. Mat saltImg = img.clone(); //复制图像  
  8. cvImgProc.salt(saltImg, 1000); //添加椒盐噪声  
  9. namedWindow("saltlena", CV_WINDOW_AUTOSIZE);  
  10. imshow("saltlena", saltImg);  
  11.   
  12. Mat blurImg;  
  13. medianBlur(saltImg, blurImg, 3); //5*5中值滤波  
  14. namedWindow("blurImg", CV_WINDOW_AUTOSIZE);  
  15. imshow("blurImg", blurImg);  

5. canny边缘检测

[cpp] view plain copy
  1. Mat img = imread("lena.bmp", 0); //读取图像  
  2. namedWindow("lena", CV_WINDOW_AUTOSIZE);  
  3. imshow("lena", img);  
  4.   
  5. Mat contours;  
  6. Canny(img, contours, 125, 350); //canny边缘检测  
  7. namedWindow("contours", CV_WINDOW_AUTOSIZE);  
  8. imshow("contours", contours);  
  9.   
  10. Mat contoursInv;   
  11. threshold(contours, contoursInv, 128, 255, THRESH_BINARY_INV); //反转边缘图像  
  12. namedWindow("contoursInv", CV_WINDOW_AUTOSIZE);  
  13. imshow("contoursInv", contoursInv);  

6. 腐蚀操作

原理:腐蚀替换当前像素位像素集合中找到的最小像素值。

[cpp] view plain copy
  1. //读取输入图像  
  2. Mat image = imread("binary.bmp");  
  3. namedWindow("binary");  
  4. imshow("binary", image);  
  5.   
  6. //腐蚀图像  
  7. Mat eroded; //目标图像  
  8.  //使用默认的方形结构元素(等价于以下注释掉的代码)  
  9. erode(image, eroded, Mat());  
  10. //Mat element(3, 3, CV_8U, Scalar(1));  
  11. //erode(image, eroded, element);  
  12. //显示腐蚀后的图像  
  13. namedWindow("Eroded Image");  
  14. imshow("Eroded Image", eroded);  

7. 膨胀操作

原理:膨胀是替换当前像素位像素集合中找到的最大像素值。

[cpp] view plain copy
  1. //读取输入图像  
  2. Mat image = imread("binary.bmp");  
  3. namedWindow("binary");  
  4. imshow("binary", image);  
  5.   
  6. //膨胀图像  
  7. Mat dilated; //目标图像  
  8. //使用默认的方形结构元素(等价于以下注释掉的代码)  
  9. dilate(image, dilated, Mat());  
  10. //Mat element(3, 3, CV_8U, Scalar(1));  
  11. //dilate(image, dilated, element);  
  12. //显示膨胀后的图像  
  13. namedWindow("Dilated Image");  
  14. imshow("Dilated Image", dilated);  

还可以进行多次膨胀,只需将执行函数该为:

[cpp] view plain copy
  1. dilate(image, dilated, Mat(), Point(-1, -1), 3);  


8. 图像二值化

[cpp] view plain copy
  1. CvImgProc cvImgProc;  
  2.   
  3. //读取输入图像  
  4. //Mat image = imread("lena.bmp");  
  5. IplImage* iplImage = cvLoadImage("lena.bmp");  
  6.   
  7. IplImage* iplImage2 = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 1);   
  8.   
  9. double thresholdVal = cvImgProc.cvThresholdOtsu(iplImage);  
  10. printf("thresholdVal = %lf", thresholdVal);  
  11.   
  12. Mat image(iplImage, false);  
  13. Mat image3;  
  14. threshold(image, image3, thresholdVal, 255, THRESH_BINARY);  
  15. namedWindow("binary");  
  16. imshow("binary", image3);  

得出阈值是127

version 2:

[cpp] view plain copy
  1. CvImgProc cvImgProc;  
  2.   
  3. //读取输入图像  
  4. Mat image = imread("camera.tiff");  
  5.   
  6. Mat image2;  
  7. int thresholdVal = cvImgProc.cvOtsu(image);  
  8. printf("thresholdVal = %d", thresholdVal);  
  9. threshold(image, image2, thresholdVal, 255, THRESH_BINARY);  
  10. namedWindow("binary");  
  11. imshow("binary", image2);  
  12. imwrite("cameraBinary.bmp", image2);  

9.闭运算

[cpp] view plain copy
  1. //读取输入图像  
  2. Mat image = imread("lenaBinary.bmp");  
  3. Mat element5(3, 3, CV_8U, Scalar(1));  
  4. Mat closed;  
  5. morphologyEx(image, closed, MORPH_CLOSE, element5);  
  6. namedWindow("closed");  
  7. imshow("closed", closed);  

10.开运算

[cpp] view plain copy
  1. //读取输入图像  
  2. Mat image = imread("lenaBinary.bmp");  
  3. Mat element3(3, 3, CV_8U, Scalar(1));  
  4. Mat opened;  
  5. morphologyEx(image, opened, MORPH_CLOSE, element3);  
  6. namedWindow("closed");  
  7. imshow("closed", opened);  

11.三通道彩色图像转单通道灰度图像

[cpp] view plain copy
  1. //读取输入图像  
  2. Mat image = imread("pepper.bmp");  
  3. namedWindow("image");  
  4. imshow("image", image);  
  5. Mat image2;  
  6. cvtColor(image, image2, CV_BGR2GRAY, 1); //尾参:无/0保留通道个数;1单通道;3三通道。  
  7. namedWindow("image2");  
  8. imshow("image2", image2);  
  9. imwrite("pepperGray.bmp", image2);  


12.求图像的最大值和最小值

[cpp] view plain copy
  1. //读取输入图像  
  2. Mat image = imread("lena.bmp");  
  3. namedWindow("image");  
  4. imshow("image", image);  
  5. double minVal, maxVal;  
  6. minMaxLoc(image, &minVal, &maxVal);  
  7. printf("minVal = %lf\n", minVal);  
  8. printf("maxVal = %lf\n", maxVal);  

13.角点提取

[cpp] view plain copy
  1. //读取输入图像  
  2. Mat image = imread("calibrateGray.bmp");  
  3. namedWindow("image");  
  4. imshow("image", image);  
  5.   
  6. //检测角点  
  7. Mat cornerStrength;  
  8. cornerHarris(image, cornerStrength,   
  9.                     3, //相邻像素的尺寸  
  10.                     3, //滤波器的孔径大小  
  11.                     0.01); //Harris参数  
  12.   
  13. //角点强度的阈值  
  14. Mat harrisCorners;  
  15. double thresholdVal = 0.0001;  
  16. threshold(cornerStrength, harrisCorners, thresholdVal, 255, THRESH_BINARY_INV);  
  17. namedWindow("harrisCorners");  
  18. imshow("harrisCorners", harrisCorners);  
  19. imwrite("calibrateHarris.bmp", harrisCorners);  
14.判断图像是否读入成功

[cpp] view plain copy
  1. //读取输入图像  
  2. Mat image = imread("calibrateGray.bmp");  
  3. if (!image.data)  
  4. {  
  5.     printf("读取图像失败\n");  
  6. }  

15. 将unsigned char*(或BYTE*)封装成Mat类型

version 1

[cpp] view plain copy
  1. int width = 0;  
  2. int height = 0;  
  3. int lineByte = 0;  
  4. BYTE* imData = rdWtIm.Read8bitbmp("cam1FstImArSptImage.bmp", &width, &height, &lineByte);  
  5. printf("width = %d\n", width);  
  6. printf("height = %d\n", height);  
  7. printf("lineByte = %d\n", lineByte);  
  8.   
  9. Mat iMat(height, width, CV_8UC1, imData, lineByte);  
  10. namedWindow("lena");  
  11. imshow("lena", iMat);  

version 2

[cpp] view plain copy
  1. RdWtIm rdWtIm;  
  2.   
  3. int width = 0;  
  4. int height = 0;  
  5. int lineByte = 0;  
  6. BYTE* imData = rdWtIm.Read8bitbmp("lena.bmp", &width, &height, &lineByte); //cam1FstImArSptImage  
  7. printf("width = %d\n", width);  
  8. printf("height = %d\n", height);  
  9. printf("lineByte = %d\n", lineByte);  
  10.   
  11. //Scalar scal = 0;  
  12. Mat iMat(height, width, CV_8UC1, Scalar(0));  
  13. iMat.step = lineByte;  
  14. iMat.data = imData;  
  15. namedWindow("lena");  
  16. imshow("lena", iMat);  

16.如何使图像显示窗口能够调节大小

[cpp] view plain copy
  1. void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE )  
将参数:flags设置成WINDOW_NORMAL即可。

举例:

[cpp] view plain copy
  1. namedWindow("original image", WINDOW_NORMAL);  
  2. imshow("original image", image);  

17.如何反转图像灰度,即求图像的负片

将图像中每点的灰度变成(255-gray),其中gray是当前点的灰度。

[cpp] view plain copy
  1. void bitwise_not(InputArray src, OutputArray dst, InputArray mask=noArray())  

18.利用hough变换检测圆

[cpp] view plain copy
  1. ////hough变换检测圆  
  2. vector<Vec3f> circles;  
  3. HoughCircles(inverse, circles, CV_HOUGH_GRADIENT,  
  4.                         1, //累加器的分辨率(图像的尺寸/2)  
  5.                         6, //两个圆之间的最小距离  
  6.                         100, //Canny高阈值  
  7.                         5, //最小投票数  
  8.                         3, 7); //极小极大半径3 10  

可以将检测出的圆绘制在图中

[cpp] view plain copy
  1. //绘制圆  
  2. vector<Vec3f>::const_iterator itc = circles.begin();  
  3. while(itc != circles.end())  
  4. {  
  5.     circle(inverse, Point((*itc)[0], (*itc)[1]), //圆心  
  6.     (*itc)[2], //半径  
  7.     Scalar(255), //颜色  
  8.     2); //厚度  
  9.     ++itc;  
  10. }  
原创粉丝点击