opencv
来源:互联网 发布:足彩软件哪个好 编辑:程序博客网 时间:2024/05/29 19:45
1.反转图像
函数:cv::flip()
- void flip(InputArray src, OutputArray dst, int flipCode);
参数fipCode: 整数,水平发转;0垂直反转;负数,水平垂直均反转。2.sobel边缘检测函数:cv::sobel()
例程:
- //从文件中读入图像
- const char* imagename = "lena.BMP";
- Mat img = imread(imagename);
- if(img.empty()) //如果读入图像失败
- {
- fprintf(stderr, "Can not load image %s\n", imagename);
- return -1;
- }
-
- namedWindow("original image");
- imshow("original image",img);
-
-
- //Mat result;
- //flip(img, result, -1); //反转图像
- Mat sobelX, sobelY, sobel;
- Sobel(img, sobelX, CV_16S, 1, 0);
- Sobel(img, sobelY, CV_16S, 0, 1);
- sobel = abs(sobelX) + abs(sobelY);
-
- //搜索sobel极大值
- double sobmin, sobmax;
- minMaxLoc(sobel, &sobmin, &sobmax);
-
- //变换为8位图像
- //sobelImage = -alpha*sobel + 255
- Mat sobelImage;
- sobel.convertTo(sobelImage, CV_8U, -255./sobmax, 255);
-
- namedWindow("sobelImage");
- imshow("sobelImage", sobelImage);
-
- Mat sobelThresholded;
- double threadVal = 200;
- threshold(sobelImage, sobelThresholded, threadVal, 255, THRESH_BINARY);
-
- namedWindow("sobelThresholded");
- imshow("sobelThresholded", sobelThresholded);
3. 读取单通道灰度图像- Mat img = imread("lena.bmp", 0);
- imshow("lena", img);
建立的img是单通道的。4. 中值滤波
- CvImgProc cvImgProc;
-
- Mat img = imread("lena.bmp", 0);
- namedWindow("lena", CV_WINDOW_AUTOSIZE);
- imshow("lena", img);
-
- Mat saltImg = img.clone();
- cvImgProc.salt(saltImg, 1000);
- namedWindow("saltlena", CV_WINDOW_AUTOSIZE);
- imshow("saltlena", saltImg);
-
- Mat blurImg;
- medianBlur(saltImg, blurImg, 3);
- namedWindow("blurImg", CV_WINDOW_AUTOSIZE);
- imshow("blurImg", blurImg);
5. canny边缘检测- Mat img = imread("lena.bmp", 0);
- namedWindow("lena", CV_WINDOW_AUTOSIZE);
- imshow("lena", img);
-
- Mat contours;
- Canny(img, contours, 125, 350);
- namedWindow("contours", CV_WINDOW_AUTOSIZE);
- imshow("contours", contours);
-
- Mat contoursInv;
- threshold(contours, contoursInv, 128, 255, THRESH_BINARY_INV);
- namedWindow("contoursInv", CV_WINDOW_AUTOSIZE);
- imshow("contoursInv", contoursInv);
6. 腐蚀操作原理:腐蚀替换当前像素位像素集合中找到的最小像素值。
-
- Mat image = imread("binary.bmp");
- namedWindow("binary");
- imshow("binary", image);
-
-
- Mat eroded;
-
- erode(image, eroded, Mat());
-
-
-
- namedWindow("Eroded Image");
- imshow("Eroded Image", eroded);
7. 膨胀操作
原理:膨胀是替换当前像素位像素集合中找到的最大像素值。
-
- Mat image = imread("binary.bmp");
- namedWindow("binary");
- imshow("binary", image);
-
-
- Mat dilated;
-
- dilate(image, dilated, Mat());
-
-
-
- namedWindow("Dilated Image");
- imshow("Dilated Image", dilated);
还可以进行多次膨胀,只需将执行函数该为:- dilate(image, dilated, Mat(), Point(-1, -1), 3);
8. 图像二值化
- CvImgProc cvImgProc;
-
-
-
- IplImage* iplImage = cvLoadImage("lena.bmp");
-
- IplImage* iplImage2 = cvCreateImage(cvSize(512, 512), IPL_DEPTH_8U, 1);
-
- double thresholdVal = cvImgProc.cvThresholdOtsu(iplImage);
- printf("thresholdVal = %lf", thresholdVal);
-
- Mat image(iplImage, false);
- Mat image3;
- threshold(image, image3, thresholdVal, 255, THRESH_BINARY);
- namedWindow("binary");
- imshow("binary", image3);
得出阈值是127version 2:
- CvImgProc cvImgProc;
-
-
- Mat image = imread("camera.tiff");
-
- Mat image2;
- int thresholdVal = cvImgProc.cvOtsu(image);
- printf("thresholdVal = %d", thresholdVal);
- threshold(image, image2, thresholdVal, 255, THRESH_BINARY);
- namedWindow("binary");
- imshow("binary", image2);
- imwrite("cameraBinary.bmp", image2);
9.闭运算-
- Mat image = imread("lenaBinary.bmp");
- Mat element5(3, 3, CV_8U, Scalar(1));
- Mat closed;
- morphologyEx(image, closed, MORPH_CLOSE, element5);
- namedWindow("closed");
- imshow("closed", closed);
10.开运算-
- Mat image = imread("lenaBinary.bmp");
- Mat element3(3, 3, CV_8U, Scalar(1));
- Mat opened;
- morphologyEx(image, opened, MORPH_CLOSE, element3);
- namedWindow("closed");
- imshow("closed", opened);
11.三通道彩色图像转单通道灰度图像-
- Mat image = imread("pepper.bmp");
- namedWindow("image");
- imshow("image", image);
- Mat image2;
- cvtColor(image, image2, CV_BGR2GRAY, 1);
- namedWindow("image2");
- imshow("image2", image2);
- imwrite("pepperGray.bmp", image2);
12.求图像的最大值和最小值-
- Mat image = imread("lena.bmp");
- namedWindow("image");
- imshow("image", image);
- double minVal, maxVal;
- minMaxLoc(image, &minVal, &maxVal);
- printf("minVal = %lf\n", minVal);
- printf("maxVal = %lf\n", maxVal);
13.角点提取-
- Mat image = imread("calibrateGray.bmp");
- namedWindow("image");
- imshow("image", image);
-
-
- Mat cornerStrength;
- cornerHarris(image, cornerStrength,
- 3,
- 3,
- 0.01);
-
-
- Mat harrisCorners;
- double thresholdVal = 0.0001;
- threshold(cornerStrength, harrisCorners, thresholdVal, 255, THRESH_BINARY_INV);
- namedWindow("harrisCorners");
- imshow("harrisCorners", harrisCorners);
- imwrite("calibrateHarris.bmp", harrisCorners);
14.判断图像是否读入成功-
- Mat image = imread("calibrateGray.bmp");
- if (!image.data)
- {
- printf("读取图像失败\n");
- }
15. 将unsigned char*(或BYTE*)封装成Mat类型
version 1
- int width = 0;
- int height = 0;
- int lineByte = 0;
- BYTE* imData = rdWtIm.Read8bitbmp("cam1FstImArSptImage.bmp", &width, &height, &lineByte);
- printf("width = %d\n", width);
- printf("height = %d\n", height);
- printf("lineByte = %d\n", lineByte);
-
- Mat iMat(height, width, CV_8UC1, imData, lineByte);
- namedWindow("lena");
- imshow("lena", iMat);
version 2- RdWtIm rdWtIm;
-
- int width = 0;
- int height = 0;
- int lineByte = 0;
- BYTE* imData = rdWtIm.Read8bitbmp("lena.bmp", &width, &height, &lineByte);
- printf("width = %d\n", width);
- printf("height = %d\n", height);
- printf("lineByte = %d\n", lineByte);
-
-
- Mat iMat(height, width, CV_8UC1, Scalar(0));
- iMat.step = lineByte;
- iMat.data = imData;
- namedWindow("lena");
- imshow("lena", iMat);
16.如何使图像显示窗口能够调节大小- void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE )
将参数:flags设置成WINDOW_NORMAL即可。举例:
- namedWindow("original image", WINDOW_NORMAL);
- imshow("original image", image);
17.如何反转图像灰度,即求图像的负片将图像中每点的灰度变成(255-gray),其中gray是当前点的灰度。
- void bitwise_not(InputArray src, OutputArray dst, InputArray mask=noArray())
18.利用hough变换检测圆-
- vector<Vec3f> circles;
- HoughCircles(inverse, circles, CV_HOUGH_GRADIENT,
- 1,
- 6,
- 100,
- 5,
- 3, 7);
可以将检测出的圆绘制在图中-
- vector<Vec3f>::const_iterator itc = circles.begin();
- while(itc != circles.end())
- {
- circle(inverse, Point((*itc)[0], (*itc)[1]),
- (*itc)[2],
- Scalar(255),
- 2);
- ++itc;
- }