Qt 3D的研究(九):尝试另外一种边缘检测方法

本文探讨在Qt 3D中使用Prewitt边缘检测方法来改进3D图像的边缘识别,避免误识别和背景与主体颜色相近时的边缘问题。通过深度图渲染、纹理处理和与卡通着色图叠加,实现更精确的边缘效果。详细GLSL代码可在GitHub获取。
摘要由CSDN通过智能技术生成

Qt 3D的研究(九):尝试另外一种边缘检测方法

       三维应用程序,通过FBO,将3D图像渲染成纹理,然后对渲染成的纹理进行图像处理,最终显示在屏幕上的,是风格化后的图案。上一次我使用了一种普通的图像处理方法:索贝尔边缘检测法,与我们的卡通渲染结合起来,实现了这样的效果,接着,我将采用另外一种边缘检测方法——普雷维特(Prewitt)边缘检测方法来重新渲染图案。

蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/44405219。欢迎同行前来探讨。

       首先让我们看看上一次的截图:

       我们看到,本不应该是边缘的机身部分,由于离散的调色,被索贝尔算子边缘检测一算,也被误认为是边缘了,同时,在背景与机身颜色不明显的部分,也由于采用不适当的阈值,不被认为是边缘。所以我想有没有一种方法能够解

/***************************************************************** * Copyright (C) 2010 SDUST STUDIO 版权所有 * * 如果您在本代码的基础上进行改进或修改,请花费您宝贵的1分钟给作者发送一个附件,以进行交流,谢谢 * 欢迎与作者联系交流 * * 文件名称: .cs * 功能描述: * 作者: Leon * 创建时间: [10/29/2010 Leon] * 前景为白(1,或非零), 背景为黑(0); 仅对第一块连续的区域进行外边界标记, 有两种方式可以选择:短边界序列和完全边界序列 短边界是化简后的结果,标记了一些关键点,将这些关键点用直线连接,即得到边界线 目前完成的是8邻域,4邻域用到的情况较少,朋友们可以自己比照着8邻域来完成。 * 修改记录: * 修改人: *********************************************************************/ #include <QList> #include <QPoint> class CTrackBoundary { public: CTrackBoundary(void); ~CTrackBoundary(void); enum TrackType {Four, Eight}; // 4-邻域, 8-邻域 int row() { return m_Row; } int column(){ return m_Coulumn; } QList<QPoint> getBoundaryList() { return m_Boundary; } QList<QPoint> getShortBoundaryList() { processBoundary(); return m_ShortBoundary; } // 获取只有边界的矩阵 int** getBoundaryMatrix() { return m_isBoundary; } void setTrackType(TrackType tType) { m_Type = tType; } // 定义场景矩阵 void setMatrix(double**tMat, int iRowCount, int iColCount); void setMatrix(int iRowCount, int iColCount); void setMatrixItem(double value, int iRow, int iCol); // 执行搜边界 void action(); private: TrackType m_Type; int m_Row; int m_Coulumn; double** m_Mat; int** m_isBoundary; // 起点为6,终点8, 其余6 QList<QPoint> m_Boundary; QList<QPoint> m_ShortBoundary; int m_Four[4]; int m_Eight[8]; // 初始化矩阵 void initMatrix(); void clear(); // 计算邻域中某序号对应的偏移 void Num2XY(const int tNumber, int& dX, int& dY); void XY2Num(int& tNumber, const int dX, const int dY); // 查找第一个点的 iRow 和 iCol bool findStart(int& iRow, int& iCol); // 看(iRow, iCol)点是否是边界 int checkBoundray(int iRow, int iCol); int findNextBoundray(const int iRow, const int iCol, const int iStart, int& nRow, int& nCol); int findNextBoundray_Four(const int iRow, const int iCol, const int iStart, int& nRow, int& nCol); int findNextBoundray_Eight(const int iRow, const int iCol, const int iStart, int& nRow, int& nCol); bool atEnd(int iRow, int iCol); // 化简边界 void processBoundary(); };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值