From c3e4a52fbe44ae5bf2f754e922a2e932e3d20a28 Mon Sep 17 00:00:00 2001 From: "marina.kolpakova" Date: Wed, 14 Nov 2012 20:11:18 +0400 Subject: [PATCH] soft cascade sample --- modules/gpu/src/softcascade.cpp | 4 +- samples/gpu/softcascade.cpp | 106 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 samples/gpu/softcascade.cpp diff --git a/modules/gpu/src/softcascade.cpp b/modules/gpu/src/softcascade.cpp index 0386542..7f5221f 100644 --- a/modules/gpu/src/softcascade.cpp +++ b/modules/gpu/src/softcascade.cpp @@ -287,7 +287,8 @@ struct cv::gpu::SCascade::Fields bool update(int fh, int fw, int shr) { - if (fh == luv.rows && fh == luv.cols) return false; + if ((fh == luv.rows) && (fw == luv.cols)) return false; + plane.create(fh * (HOG_LUV_BINS + 1), fw, CV_8UC1); fplane.create(fh * HOG_BINS, fw, CV_32FC1); luv.create(fh, fw, CV_8UC3); @@ -297,6 +298,7 @@ struct cv::gpu::SCascade::Fields hogluv.create((fh / shr) * HOG_LUV_BINS + 1, fw / shr + 1, CV_32SC1); hogluv.setTo(cv::Scalar::all(0)); + return true; } diff --git a/samples/gpu/softcascade.cpp b/samples/gpu/softcascade.cpp new file mode 100644 index 0000000..3c08fdb --- /dev/null +++ b/samples/gpu/softcascade.cpp @@ -0,0 +1,106 @@ +#include +#include +#include + +int main(int argc, char** argv) +{ + const std::string keys = + "{help h usage ? | | print this message }" + "{cascade c | | path to configuration xml }" + "{frames f | | path to configuration xml }" + "{min_scale |0.4f | path to configuration xml }" + "{max_scale |5.0f | path to configuration xml }" + "{total_scales |55 | path to configuration xml }" + "{device d |0 | path to configuration xml }" + ; + + cv::CommandLineParser parser(argc, argv, keys); + parser.about("Soft cascade training application."); + + if (parser.has("help")) + { + parser.printMessage(); + return 0; + } + + if (!parser.check()) + { + parser.printErrors(); + return 1; + } + + cv::gpu::setDevice(parser.get("device")); + + std::string cascadePath = parser.get("cascade"); + + cv::FileStorage fs(cascadePath, cv::FileStorage::READ); + if(!fs.isOpened()) + { + std::cout << "Soft Cascade file " << cascadePath << " can't be opened." << std::endl << std::flush; + return 1; + } + + std::cout << "Read cascade from file " << cascadePath << std::endl; + + float minScale = parser.get("min_scale"); + float maxScale = parser.get("max_scale"); + int scales = parser.get("total_scales"); + + using cv::gpu::SCascade; + SCascade cascade(minScale, maxScale, scales); + + if (!cascade.load(fs.getFirstTopLevelNode())) + { + std::cout << "Soft Cascade can't be parsed." << std::endl << std::flush; + return 1; + } + + std::string frames = parser.get("frames"); + cv::VideoCapture capture(frames); + if(!capture.isOpened()) + { + std::cout << "Frame source " << frames << " can't be opened." << std::endl << std::flush; + return 1; + } + + cv::gpu::GpuMat objects(1, sizeof(SCascade::Detection) * 10000, CV_8UC1); + cv::gpu::printShortCudaDeviceInfo(parser.get("device")); + for (;;) + { + cv::Mat frame; + if (!capture.read(frame)) + { + std::cout << "Nothing to read. " << std::endl << std::flush; + return 0; + } + + cv::gpu::GpuMat dframe(frame), roi(frame.rows, frame.cols, CV_8UC1), trois; + roi.setTo(cv::Scalar::all(1)); + cascade.genRoi(roi, trois); + cascade.detect(dframe, trois, objects); + + cv::Mat dt(objects); + typedef cv::gpu::SCascade::Detection Detection; + + Detection* dts = ((Detection*)dt.data) + 1; + int* count = dt.ptr(0); + + std::cout << *count << std::endl; + + cv::Mat result; + frame.copyTo(result); + + + for (int i = 0; i < *count; ++i) + { + Detection d = dts[i]; + cv::rectangle(result, cv::Rect(d.x, d.y, d.w, d.h), cv::Scalar(255, 0, 0, 255), 1); + } + + std::cout << "working..." << std::endl; + cv::imshow("Soft Cascade demo", result); + cv::waitKey(10); + } + + return 0; +} \ No newline at end of file -- 2.7.4