opencv学习-创新互联
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
通辽网站制作公司哪家好,找创新互联建站!从网页设计、网站建设、微信开发、APP开发、响应式网站开发等网站项目制作,到程序开发,运营维护。创新互联建站自2013年创立以来到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联建站。
前言
使用opencv实现halcon中moments_gray_plane算子
提示:以下是本篇文章正文内容,下面案例可供参考
代码如下(示例):
2.调用案例#include
#include #include #include "opencv2/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui.hpp" #include using namespace cv; using namespace std; bool Moments_gray_plane(Mat mask, Mat img, Mat &dst) { if (img.size() != dst.size() || img.channels() != dst.channels() || img.size() != mask.size()) { return false; } Mat labels, stats, centroids; double MRow, MCol, Alpha, Beta, Mean; int sum = 0; //num 为联通区域数量,此时mask中只有一个有效区域 int num = connectedComponentsWithStats(mask, labels, stats, centroids); int acreage = stats.at (1, CC_STAT_AREA); //第1个连通域的面积(包含的像素点总数) int left = stats.at (1, CC_STAT_LEFT); //第1个连通域的bbox的最左边列坐标值340 int top = stats.at (1, CC_STAT_TOP); //第1个连通域的bbox的最上行坐标值50 int width = stats.at (1, CC_STAT_WIDTH); //第1个连通域的宽度 int height = stats.at (1, CC_STAT_HEIGHT); //第1个连通域的高度 double center_x = centroids.at (1, 0); //第1个连通域的质心x坐标(col)384.5 double center_y = centroids.at (1, 1); //第1个连通域的质心y坐标(row)104.5 //labels矩阵(row,col)对应坐标(y,x),由于定义访问矩阵的行指针,为避免混淆按行列比较清晰 //可直接利用蒙版求均值 Scalar myMean; myMean = mean(img, mask); double SRow = 0, SCol = 0; for (int row = top; row< (top + height); row++) { uchar *p = img.ptr (row); int *label = labels.ptr (row); for (int col = left; col< (left + width); col++) { //int label = labels.at (row, col); if (label[col] == 1) { SCol = SCol + (col - center_x) * (p[col] - myMean[0]); SRow = SRow + (row - center_y) * (p[col] - myMean[0]); } } } MRow = SRow / (acreage * acreage); MCol = SCol / (acreage * acreage); vector >con; vector con1; findContours(mask, con, RETR_EXTERNAL, CHAIN_APPROX_NONE); con1 = con[0]; Moments M; M = moments(con1); //halcon中m20对应opencv中m02 Alpha = (MRow * M.nu20 - M.nu11 * MCol) / (M.nu02 * M.nu20 - M.nu11 * M.nu11); Beta = (M.nu02 * MCol - MRow * M.nu11) / (M.nu02 * M.nu20 - M.nu11 * M.nu11); dst.forEach ([&](uchar& pixel, const int position[]) ->void { // position 在单通道情况下,是一个包含两个元素的数组,即x, y; pixel = Alpha*(position[1] - center_y) + Beta*(position[0] - center_x) + myMean[0]; }); return true; }
代码如下(示例):
int main()
{
Mat src = imread("mreut.png",0);
Mat dst(src.size(), CV_8UC1);
Mat Mask = Mat::zeros(src.size(), CV_8UC1);
cv::circle(Mask, cv::Point(300,200), 100.5, cv::Scalar(255), -1);
Moments_gray_plane( Mask, src, dst);
imshow("mask", Mask);
Mat sub;
sub = dst - src + 128;
imshow("dst", sub);
//system("pause");
waitKey(0);
return 0;
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网页名称:opencv学习-创新互联
分享地址:http://lswzjz.com/article/deehoi.html