#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
#include<fstream>
using namespace cv;
using namespace std;
int CenterPoint(Mat src, Point center)
{
if (!src.data)
{
cout << "no image!" << endl;
return -1;
}
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(src, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
vector<Moments> mu(contours.size());
for (int i = 0; i < contours.size(); i++)
{
mu[i] = moments(contours[i], true);
}
vector<Point2f> 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);
}
//我的contours只有1个轮廓
center.x = mc[0].x;
center.y = mc[0].y;
return 0;
}
int main()
{
Mat srcimg = imread("2.bmp");
Mat graysrc(srcimg.size(), CV_8UC1);
cvtColor(srcimg, graysrc, CV_BGR2GRAY);
threshold(graysrc, graysrc, 100, 255, CV_THRESH_BINARY);
for (int i = 0; i < srcimg.rows; i++)
{
for (int j = srcimg.cols / 2; j < srcimg.cols; j++)
{
graysrc.ptr<uchar>(i)[j] = 255;
}
}
//imshow("gray", graysrc);
//waitKey(0);
Point center;
int flag = CenterPoint(graysrc, center);
}
举了一个例子,验证是正确的。刚刚看了下,计算图像中心矩的moments函数有对应的openCL版本:
启动OpenCL环境,并使用UMat即可启动这个OpenCL版本的OpenCV-API来计算中心。这里就不详写了。
多个轮廓下只用opencv函数寻找图形中心点:
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
#include<fstream>
using namespace cv;
using namespace std;
int CenterPoint(Mat src, vector<Point> ¢erpts)
{
if (!src.data)
{
cout << "no image!" << endl;
return -1;
}
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(src, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
vector<Moments> mu(contours.size());
for (int i = 0; i < contours.size(); i++)
{
mu[i] = moments(contours[i], true);
}
centerpts.resize(contours.size());
vector<Point2f> 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);
Point ¢er=centerpts[i];
center.x=mc[i].x;
center.y=mc[i].y;
}
return 0;
}
int main()
{
Mat srcimg = imread("1.jpg");
const size_t img_rows=1456;
const size_t img_cols=1936;
Mat thesrc=srcimg(Rect(1936,0,1936,1456));
Mat graysrc(thesrc.size(), CV_8UC1);
cvtColor(thesrc, graysrc, CV_BGR2GRAY);
threshold(graysrc, graysrc, 80, 255, CV_THRESH_BINARY);
// imwrite("srcbw.jpg", graysrc);
vector<Point> centers;
int flag = CenterPoint(graysrc, centers);
for(int ind=0;ind!=centers.size();ind++)
{
Point the_center=centers[ind];
cout<<"the center: ("<<the_center.x<<" , "<<the_center.y<<" )"<<endl;
}
return 0;
}