| 49 | |
| 50 | template<typename T> |
| 51 | void edgeTrackingHysteresis(Param<T> output, CParam<T> strong, CParam<T> weak) { |
| 52 | auto initEdgeOut = common::getKernel( |
| 53 | "arrayfire::cuda::initEdgeOut", {{canny_cuh_src}}, |
| 54 | TemplateArgs(TemplateTypename<T>()), |
| 55 | {{DefineValue(STRONG), DefineValue(WEAK), DefineValue(NOEDGE), |
| 56 | DefineValue(THREADS_X), DefineValue(THREADS_Y)}}); |
| 57 | auto edgeTrack = common::getKernel( |
| 58 | "arrayfire::cuda::edgeTrack", {{canny_cuh_src}}, |
| 59 | TemplateArgs(TemplateTypename<T>()), |
| 60 | {{DefineValue(STRONG), DefineValue(WEAK), DefineValue(NOEDGE), |
| 61 | DefineValue(THREADS_X), DefineValue(THREADS_Y)}}); |
| 62 | auto suppressLeftOver = common::getKernel( |
| 63 | "arrayfire::cuda::suppressLeftOver", {{canny_cuh_src}}, |
| 64 | TemplateArgs(TemplateTypename<T>()), |
| 65 | {{DefineValue(STRONG), DefineValue(WEAK), DefineValue(NOEDGE), |
| 66 | DefineValue(THREADS_X), DefineValue(THREADS_Y)}}); |
| 67 | |
| 68 | dim3 threads(kernel::THREADS_X, kernel::THREADS_Y); |
| 69 | |
| 70 | // Launch only threads to process non-border pixels |
| 71 | int blk_x = divup(weak.dims[0] - 2, threads.x); |
| 72 | int blk_y = divup(weak.dims[1] - 2, threads.y); |
| 73 | |
| 74 | // launch batch * blk_x blocks along x dimension |
| 75 | dim3 blocks(blk_x * weak.dims[2], blk_y * weak.dims[3]); |
| 76 | |
| 77 | EnqueueArgs qArgs(blocks, threads, getActiveStream()); |
| 78 | initEdgeOut(qArgs, output, strong, weak, blk_x, blk_y); |
| 79 | POST_LAUNCH_CHECK(); |
| 80 | |
| 81 | auto flagPtr = edgeTrack.getDevPtr("hasChanged"); |
| 82 | |
| 83 | int notFinished = 1; |
| 84 | while (notFinished) { |
| 85 | notFinished = 0; |
| 86 | edgeTrack.setFlag(flagPtr, ¬Finished); |
| 87 | edgeTrack(qArgs, output, blk_x, blk_y); |
| 88 | POST_LAUNCH_CHECK(); |
| 89 | notFinished = edgeTrack.getFlag(flagPtr); |
| 90 | } |
| 91 | suppressLeftOver(qArgs, output, blk_x, blk_y); |
| 92 | POST_LAUNCH_CHECK(); |
| 93 | } |
| 94 | } // namespace kernel |
| 95 | } // namespace cuda |
| 96 | } // namespace arrayfire |
nothing calls this directly
no test coverage detected