opencv学习-创新互联

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

通辽网站制作公司哪家好,找创新互联建站!从网页设计、网站建设、微信开发、APP开发、响应式网站开发等网站项目制作,到程序开发,运营维护。创新互联建站自2013年创立以来到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联建站


前言

使用opencv实现halcon中moments_gray_plane算子


提示:以下是本篇文章正文内容,下面案例可供参考

一、代码 1.功能实现

代码如下(示例):

#include#include#include#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#includeusing 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;
    vectorcon1;
    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;
}
2.调用案例

代码如下(示例):

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://myzitong.com/article/deehoi.html