level 1
#include <opencv2\opencv.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include <highgui.h>
#include "stdafx.h"
using namespace cv;
using namespace std;
int main()
{
cv::Mat src = cv::imread("orange.jpg", 1);
cv::imshow("src", src);
//--------------------------------------图像颜色分割得到二值图像------------------------------------------
Mat binary = Mat::zeros(src.size(), CV_8UC1);
for (int ii = 0; ii<src.rows; ii++)
for (int jj = 0; jj<src.cols; jj++) {
int b = (int)(src.at<Vec3b>(ii, jj)[0]);
int r = (int)(src.at<Vec3b>(ii, jj)[2]);
if (r>150 & b<200) {
binary.at<uchar>(ii, jj) = 255;
}
else binary.at<uchar>(ii, jj) = 0;
}
cv::imshow("binary", binary);
cv::imwrite("binary.jpg", binary);
//-------------------------对图像进行腐蚀,使得各个橘子不再连通--------------------------------------
Mat element = cv::getStructuringElement(MORPH_RECT, Size(15, 15));
Mat erodeImg;
cv::erode(binary, erodeImg, element);
imshow("erod", erodeImg);
cv::imwrite("erod.jpg", erodeImg);
//--------------------------对腐蚀后的图像膨胀,以便获得轮廓(和【1】中轮廓提取一样)--------------
Mat element2 = cv::getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
Mat Img2;
cv::dilate(erodeImg, Img2, element2);
Mat edge = Img2 - erodeImg;
imshow("edge", edge);
cv::imwrite("edge.jpg", edge);
//-------------------------------------------查找轮廓并拟合圆--------------------------------------------
//定义轮廓和层次结构
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
//查找轮廓
int model = CV_RETR_CCOMP;//针对不同的情况,几种方法应该都试一下,效果还是不一样的
int method = CV_CHAIN_APPROX_NONE;
cv::findContours(edge, contours, hierarchy, model, method);
//遍历轮廓,绘拟合圆
for (int index = 0; index >= 0; index = hierarchy[index][0]) {
float radius; cv::Point2f center;
cv::minEnclosingCircle(contours[index], center, radius);
RotatedRect rect = cv::minAreaRect(contours[index]);
double ratio = double(rect.size.height) / double(rect.size.width + 0.01);
if (radius>5 && ratio>0.5&&ratio<5.0) { //对橘子的半径,长短轴比进行一定的限定
//drawContours(src,contours,index,Scalar(255,255,0),CV_FILLED,8,hierarchy);
cv::circle(src, center, radius + 6.0, Scalar(255, 0, 0), 1, 8); //radius+6.0将之前腐蚀时减小量补回来
}
}
cv::imshow("src with fitting-circles", src);
cv::imwrite("fitting-circles.jpg", src);
cv::waitKey(0);
return 0;
}
整个代码在此
2018年06月11日 13点06分
