Get the center of contour

通过寻找轮廓的中心,以便对此进行旋转,校正;

计算方法:

 mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00 );

即不同方向的矩进行运算;

static int calCoutorCenter(char* Imgname, vector & mc, double minarea = 0, double whRatio = 1);
int main()
{char* filename = new char[50];strcpy(filename, "../image/rl_4.jpg");//getContoursByCplus(filename);vector mc;calCoutorCenter(filename, mc);delete[] filename;return 0;
}

API实现转自 opencv ref.

static int calCoutorCenter(char* Imgname, vector & mc, double minarea, double whRatio)
{RNG rng(12345);cv::Mat src, dst, canny_output;/// Load source image and convert it to graysrc = imread(Imgname, 0);if (!src.data){std::cout << "read data error!" << std::endl;return -1;}blur(src, src, Size(3, 3));//the pram. for findContours,vector > contours;vector hierarchy;/// Detect edges using cannyCanny(src, canny_output, 80, 255, 3);/// Find contoursfindContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));//CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLEdouble maxarea = 0;int maxAreaIdx = 0;for (int i = 0; imaxarea){maxarea = tmparea;maxAreaIdx = i;continue;}if (tmparea < minarea){//删除面积小于设定值的轮廓contours.erase(contours.begin() + i);std::wcout << "delete a small area" << std::endl;continue;}//计算轮廓的直径宽高Rect aRect = boundingRect(contours[i]);if ((aRect.width / aRect.height) mu(contours.size());for (int i = 0; i < contours.size(); i++){mu[i] = moments(contours[i], false);}///  Get the mass centers:vector mc(contours.size());for (int i = 0; i < contours.size(); i++){mc[i] = Point2f(mu[i].m10 / mu[i].m00, mu[i].m01 / mu[i].m00);std::cout << "mc[" << i << "]=" << mc[i].x << "," << mc[i].y << std::endl;}/// Draw contours,彩色轮廓dst = Mat::zeros(canny_output.size(), CV_8UC3);for (int i = 0; i< contours.size(); i++){//随机颜色Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));drawContours(dst, contours, i, color, 2, 8, hierarchy, 0, Point());circle(dst, mc[i], 4, color, -1, 8, 0);}// Create Windowchar* source_window = "countors";namedWindow(source_window, CV_WINDOW_NORMAL);imshow(source_window, dst);imwrite("dst.jpg", dst);cv:; waitKey(0);return 0;
}



本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部