Path: blob/master/modules/gapi/samples/kernel_api_snippets.cpp
16337 views
// [filter2d_api]1#include <opencv2/gapi.hpp>23G_TYPED_KERNEL(GFilter2D,4<cv::GMat(cv::GMat,int,cv::Mat,cv::Point,double,int,cv::Scalar)>,5"org.opencv.imgproc.filters.filter2D")6{7static cv::GMatDesc // outMeta's return value type8outMeta(cv::GMatDesc in , // descriptor of input GMat9int ddepth , // depth parameter10cv::Mat /* coeffs */, // (unused)11cv::Point /* anchor */, // (unused)12double /* scale */, // (unused)13int /* border */, // (unused)14cv::Scalar /* bvalue */ ) // (unused)15{16return in.withDepth(ddepth);17}18};19// [filter2d_api]2021cv::GMat filter2D(cv::GMat ,22int ,23cv::Mat ,24cv::Point ,25double ,26int ,27cv::Scalar);2829// [filter2d_wrap]30cv::GMat filter2D(cv::GMat in,31int ddepth,32cv::Mat k,33cv::Point anchor = cv::Point(-1,-1),34double scale = 0.,35int border = cv::BORDER_DEFAULT,36cv::Scalar bval = cv::Scalar(0))37{38return GFilter2D::on(in, ddepth, k, anchor, scale, border, bval);39}40// [filter2d_wrap]4142// [compound]43#include <opencv2/gapi/gcompoundkernel.hpp> // GAPI_COMPOUND_KERNEL()4445using PointArray2f = cv::GArray<cv::Point2f>;4647G_TYPED_KERNEL(HarrisCorners,48<PointArray2f(cv::GMat,int,double,double,int,double)>,49"org.opencv.imgproc.harris_corner")50{51static cv::GArrayDesc outMeta(const cv::GMatDesc &,52int,53double,54double,55int,56double)57{58// No special metadata for arrays in G-API (yet)59return cv::empty_array_desc();60}61};6263// Define Fluid-backend-local kernels which form GoodFeatures64G_TYPED_KERNEL(HarrisResponse,65<cv::GMat(cv::GMat,double,int,double)>,66"org.opencv.fluid.harris_response")67{68static cv::GMatDesc outMeta(const cv::GMatDesc &in,69double,70int,71double)72{73return in.withType(CV_32F, 1);74}75};7677G_TYPED_KERNEL(ArrayNMS,78<PointArray2f(cv::GMat,int,double)>,79"org.opencv.cpu.nms_array")80{81static cv::GArrayDesc outMeta(const cv::GMatDesc &,82int,83double)84{85return cv::empty_array_desc();86}87};8889GAPI_COMPOUND_KERNEL(GFluidHarrisCorners, HarrisCorners)90{91static PointArray2f92expand(cv::GMat in,93int maxCorners,94double quality,95double minDist,96int blockSize,97double k)98{99cv::GMat response = HarrisResponse::on(in, quality, blockSize, k);100return ArrayNMS::on(response, maxCorners, minDist);101}102};103104// Then implement HarrisResponse as Fluid kernel and NMSresponse105// as a generic (OpenCV) kernel106// [compound]107108// [filter2d_ocv]109#include <opencv2/gapi/cpu/gcpukernel.hpp> // GAPI_OCV_KERNEL()110#include <opencv2/imgproc.hpp> // cv::filter2D()111112GAPI_OCV_KERNEL(GCPUFilter2D, GFilter2D)113{114static void115run(const cv::Mat &in, // in - derived from GMat116const int ddepth, // opaque (passed as-is)117const cv::Mat &k, // opaque (passed as-is)118const cv::Point &anchor, // opaque (passed as-is)119const double delta, // opaque (passed as-is)120const int border, // opaque (passed as-is)121const cv::Scalar &, // opaque (passed as-is)122cv::Mat &out) // out - derived from GMat (retval)123{124cv::filter2D(in, out, ddepth, k, anchor, delta, border);125}126};127// [filter2d_ocv]128129int main(int, char *[])130{131std::cout << "This sample is non-complete. It is used as code snippents in documentation." << std::endl;132133cv::Mat conv_kernel_mat;134135{136// [filter2d_on]137cv::GMat in;138cv::GMat out = GFilter2D::on(/* GMat */ in,139/* int */ -1,140/* Mat */ conv_kernel_mat,141/* Point */ cv::Point(-1,-1),142/* double */ 0.,143/* int */ cv::BORDER_DEFAULT,144/* Scalar */ cv::Scalar(0));145// [filter2d_on]146}147148{149// [filter2d_wrap_call]150cv::GMat in;151cv::GMat out = filter2D(in, -1, conv_kernel_mat);152// [filter2d_wrap_call]153}154155return 0;156}157158159