{"id":2181,"date":"2025-03-24T08:48:05","date_gmt":"2025-03-23T23:48:05","guid":{"rendered":"https:\/\/dexall.co.jp\/articles\/?p=2181"},"modified":"2025-03-24T08:48:30","modified_gmt":"2025-03-23T23:48:30","slug":"c%e3%81%a7opencv%e3%82%92%e4%bd%bf%e3%81%84%e3%81%93%e3%81%aa%e3%81%99%ef%bc%81%e7%94%bb%e5%83%8f%e5%87%a6%e7%90%86%e3%82%a2%e3%83%97%e3%83%aa%e3%82%b1%e3%83%bc%e3%82%b7%e3%83%a7%e3%83%b3%e9%96%8b","status":"publish","type":"post","link":"https:\/\/dexall.co.jp\/articles\/?p=2181","title":{"rendered":"C++\u3067OpenCV\u3092\u4f7f\u3044\u3053\u306a\u3059\uff01\u753b\u50cf\u51e6\u7406\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u5b8c\u5168\u30ac\u30a4\u30c9"},"content":{"rendered":"\n<div class=\"toc\"><br \/>\n<b>Warning<\/b>:  Undefined array key \"is_admin\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>116<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_category_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>121<\/b><br \/>\n<br \/>\n<b>Warning<\/b>:  Undefined array key \"is_top\" in <b>\/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/sango-theme\/library\/gutenberg\/dist\/classes\/Toc.php<\/b> on line <b>128<\/b><br \/>\n    <div id=\"toc_container\" class=\"sgb-toc--bullets js-smooth-scroll\" data-dialog-title=\"\u76ee\u6b21\">\n      <p class=\"toc_title\">\u76ee\u6b21 <\/p>\n      <ul class=\"toc_list\">  <li class=\"first\">    <a href=\"#i-0\">OpenCV\u3068C++\u306b\u3088\u308b\u753b\u50cf\u51e6\u7406\u306e\u57fa\u790e\u77e5\u8b58<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-1\">OpenCV\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u7279\u5fb4\u3068\u5c55\u671b<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-4\">C++\u3067\u306e\u753b\u50cf\u51e6\u7406\u306b\u304a\u3051\u308b\u6027\u80fd\u512a\u4f4d\u6027<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-8\">\u958b\u767a\u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u624b\u9806<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-9\">Visual Studio \u3067\u306e OpenCV \u74b0\u5883\u69cb\u7bc9<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-14\">CMake \u3092\u4f7f\u3063\u305f\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u958b\u767a\u74b0\u5883\u306e\u6e96\u5099<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-19\">\u753b\u50cf\u51e6\u7406\u306e\u57fa\u672c\u64cd\u4f5c\u30de\u30b9\u30bf\u30fc<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-20\">\u753b\u50cf\u306e\u8aad\u307f\u8fbc\u307f\u3068\u8868\u793a\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-23\">\u753b\u50cf\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u3068\u52b9\u679c\u7684\u306a\u524d\u51e6\u7406\u30c6\u30af\u30cb\u30c3\u30af<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-27\">\u5b9f\u8df5\u7684\u306a\u753b\u50cf\u51e6\u7406\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306e\u5b9f\u88c5<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-28\">\u9854\u691c\u51fa\u30b7\u30b9\u30c6\u30e0\u306e\u69cb\u7bc9\u624b\u9806<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-30\">\u7269\u4f53\u8ffd\u8de1\u6a5f\u80fd\u306e\u5b9f\u88c5\u65b9\u6cd5<\/a>      <\/li>    <\/ul>  <\/li>  <li>    <a href=\"#i-32\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-33\">\u30e1\u30e2\u30ea\u7ba1\u7406\u3068\u51e6\u7406\u901f\u5ea6\u306e\u6539\u5584\u624b\u6cd5<\/a>      <\/li>      <li>        <a href=\"#i-36\">\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u3092\u6d3b\u7528\u3057\u305f\u4e26\u5217\u51e6\u7406\u306e\u5b9f\u88c5<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-41\">\u753b\u50cf\u8a8d\u8b58\u3092\u7528\u3044\u305f\u81ea\u52d5\u5316\u30b7\u30b9\u30c6\u30e0\u306e\u69cb\u7bc9<\/a>      <\/li>    <\/ul>  <\/li>  <li class=\"last\">    <a href=\"#i-48\">\u307e\u3068\u3081\u3068\u4eca\u5f8c\u306e\u5c55\u671b<\/a>    <ul class=\"menu_level_1\">      <li class=\"first\">        <a href=\"#i-49\">\u4e3b\u8981\u306a\u5b9f\u88c5\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>      <li>        <a href=\"#i-50\">\u958b\u767a\u4e0a\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8<\/a>      <\/li>      <li>        <a href=\"#i-51\">\u4eca\u5f8c\u306e\u5c55\u671b<\/a>      <\/li>      <li>        <a href=\"#i-52\">\u5b9f\u88c5\u6642\u306e\u6ce8\u610f\u70b9<\/a>      <\/li>      <li>        <a href=\"#i-53\">\u5229\u7528\u30b7\u30fc\u30f3\u5225\u306e\u63a8\u5968\u69cb\u6210<\/a>      <\/li>      <li class=\"last\">        <a href=\"#i-54\">\u304a\u308f\u308a\u306b<\/a>      <\/li>    <\/ul>  <\/li><\/ul>\n      <a href=\"#\" class=\"sgb-toc-button js-toc-button\" rel=\"nofollow\" data-open-dialog=\"true\"><i class=\"fa fa-list\"><\/i><span class=\"sgb-toc-button__text\">\u76ee\u6b21\u3078<\/span><\/a>\n    <\/div><\/div><h2 class=\"wp-block-heading\" id=\"i-0\">OpenCV\u3068C++\u306b\u3088\u308b\u753b\u50cf\u51e6\u7406\u306e\u57fa\u790e\u77e5\u8b58<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-1\">OpenCV\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u7279\u5fb4\u3068\u5c55\u671b<\/h3>\n\n\n\n<p>OpenCV\uff08Open Source Computer Vision Library\uff09\u306f\u3001\u753b\u50cf\u51e6\u7406\u3068\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30d3\u30b8\u30e7\u30f3\u306e\u305f\u3081\u306e\u5f37\u529b\u306a\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u3059\u30021999\u5e74\u306bIntel\u306b\u3088\u3063\u3066\u958b\u767a\u304c\u958b\u59cb\u3055\u308c\u3001\u73fe\u5728\u3082\u6d3b\u767a\u306b\u958b\u767a\u304c\u7d9a\u3051\u3089\u308c\u3066\u3044\u308b\u672c\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u4e3b\u8981\u306a\u7279\u5fb4\u3092\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-2\">\u4e3b\u8981\u306a\u7279\u5fb4<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8c4a\u5bcc\u306a\u6a5f\u80fd\u30bb\u30c3\u30c8<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>2500\u4ee5\u4e0a\u306e\u6700\u9069\u5316\u3055\u308c\u305f\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0<\/li>\n\n\n\n<li>\u753b\u50cf\u51e6\u7406\u306e\u57fa\u672c\u64cd\u4f5c\u304b\u3089\u9ad8\u5ea6\u306a\u6a5f\u68b0\u5b66\u7fd2\u307e\u3067\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u753b\u50cf\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u3001\u7279\u5fb4\u691c\u51fa\u3001\u7269\u4f53\u8a8d\u8b58\u306a\u3069\u5305\u62ec\u7684\u306a\u6a5f\u80fd\u7fa4<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30de\u30eb\u30c1\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5bfe\u5fdc<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Windows\u3001Linux\u3001macOS\u3001iOS\u3001Android\u306a\u3069\u4e3b\u8981OS\u5bfe\u5fdc<\/li>\n\n\n\n<li>ARM architecture\u3092\u542b\u3080\u69d8\u3005\u306a\u30d7\u30ed\u30bb\u30c3\u30b5\u306b\u5bfe\u5fdc<\/li>\n\n\n\n<li>GPU\u30a2\u30af\u30bb\u30e9\u30ec\u30fc\u30b7\u30e7\u30f3\uff08CUDA\u3001OpenCL\uff09\u306e\u30b5\u30dd\u30fc\u30c8<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6d3b\u767a\u306a\u30b3\u30df\u30e5\u30cb\u30c6\u30a3<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b9a\u671f\u7684\u306a\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3068\u30d0\u30b0\u4fee\u6b63<\/li>\n\n\n\n<li>\u5145\u5b9f\u3057\u305f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3068\u30b5\u30f3\u30d7\u30eb\u30b3\u30fc\u30c9<\/li>\n\n\n\n<li>Stack Overflow\u306a\u3069\u3067\u306e\u8c4a\u5bcc\u306a\u30b5\u30dd\u30fc\u30c8\u60c5\u5831<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-3\">\u6700\u65b0\u306e\u30c8\u30ec\u30f3\u30c9\u3068\u5c06\u6765\u5c55\u671b<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30a3\u30fc\u30d7\u30e9\u30fc\u30cb\u30f3\u30b0\u306e\u7d71\u5408<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>DNN\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u5f37\u5316<\/li>\n\n\n\n<li>TensorFlow\u3001PyTorch\u3068\u306e\u9023\u643a\u6a5f\u80fd<\/li>\n\n\n\n<li>\u30a8\u30c3\u30b8\u30c7\u30d0\u30a4\u30b9\u3067\u306e\u63a8\u8ad6\u51e6\u7406\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u51e6\u7406\u306e\u9032\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>3D\u8996\u899a\u5316\u6a5f\u80fd\u306e\u62e1\u5f35<\/li>\n\n\n\n<li>AR\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30b5\u30dd\u30fc\u30c8\u5f37\u5316<\/li>\n\n\n\n<li>SLAM\uff08Simultaneous Localization and Mapping\uff09\u6a5f\u80fd\u306e\u5145\u5b9f<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-4\">C++\u3067\u306e\u753b\u50cf\u51e6\u7406\u306b\u304a\u3051\u308b\u6027\u80fd\u512a\u4f4d\u6027<\/h3>\n\n\n\n<p>C++\u3068OpenCV\u306e\u7d44\u307f\u5408\u308f\u305b\u304c\u6301\u3064\u72ec\u81ea\u306e\u5f37\u307f\u306b\u3064\u3044\u3066\u3001\u5177\u4f53\u7684\u306a\u5074\u9762\u304b\u3089\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-5\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u9762\u3067\u306e\u512a\u4f4d\u6027<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u7ba1\u7406\u306e\u76f4\u63a5\u5236\u5fa1<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u52b9\u7387\u7684\u306a\u30e1\u30e2\u30ea\u7ba1\u7406\u306e\u4f8b\ncv::Mat image = cv::imread(\"input.jpg\");\n\/\/ ROI\u3092\u4f7f\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u90e8\u5206\u753b\u50cf\u51e6\u7406\ncv::Mat roi = image(cv::Rect(0, 0, 100, 100));\n\/\/ \u660e\u793a\u7684\u306a\u30e1\u30e2\u30ea\u89e3\u653e\nimage.release();<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u30a2\u30af\u30bb\u30e9\u30ec\u30fc\u30b7\u30e7\u30f3<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ GPU\u30a2\u30af\u30bb\u30e9\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u5229\u7528\u4f8b\ncv::cuda::GpuMat gpu_image;\ngpu_image.upload(image);\ncv::cuda::filter2D(gpu_image, gpu_result, -1, kernel);<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-6\">\u958b\u767a\u52b9\u7387\u3068\u30b3\u30fc\u30c9\u54c1\u8cea<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30e1\u30bf\u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u578b\u5b89\u5168\u306a\u753b\u50cf\u51e6\u7406\u306e\u4f8b\ntemplate&lt;typename T&gt;\nvoid processImage(const cv::Mat_&lt;T&gt;&amp; input, cv::Mat_&lt;T&gt;&amp; output) {\n    \/\/ \u578b\u306b\u4f9d\u5b58\u3057\u306a\u3044\u51e6\u7406\u304c\u53ef\u80fd\n    cv::filter2D(input, output, -1, kernel);\n}<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>STL\u3068\u306e\u7d71\u5408<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ STL\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u3068OpenCV\u306e\u9023\u643a\u4f8b\nstd::vector&lt;cv::KeyPoint&gt; keypoints;\ncv::FAST(image, keypoints, threshold);\n\/\/ STL\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u3092\u4f7f\u7528\u3057\u305f\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\nkeypoints.erase(\n    std::remove_if(keypoints.begin(), keypoints.end(),\n        [](const cv::KeyPoint&amp; kp) { return kp.response &lt; threshold; }),\n    keypoints.end()\n);<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-7\">\u5b9f\u52d9\u3067\u306e\u5fdc\u7528\u4fa1\u5024<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u7523\u696d\u7528\u9014\u3067\u306e\u4fe1\u983c\u6027<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u51e6\u7406\u8981\u6c42\u3078\u306e\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u78ba\u5b9f\u306a\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30b7\u30b9\u30c6\u30e0\u30ea\u30bd\u30fc\u30b9\u306e\u52b9\u7387\u7684\u306a\u5229\u7528<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u958b\u767a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u540c\u4e00\u30b3\u30fc\u30c9\u30d9\u30fc\u30b9\u3067\u306e\u591a\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5c55\u958b<\/li>\n\n\n\n<li>\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u56fa\u6709\u306e\u6700\u9069\u5316\u30aa\u30d7\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u30d3\u30eb\u30c9\u30b7\u30b9\u30c6\u30e0\u306e\u67d4\u8edf\u306a\u69cb\u6210<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u306e\u57fa\u790e\u77e5\u8b58\u3092\u8e0f\u307e\u3048\u308b\u3053\u3068\u3067\u3001\u4ee5\u964d\u306e\u7ae0\u3067\u89e3\u8aac\u3059\u308b\u5b9f\u88c5\u30c6\u30af\u30cb\u30c3\u30af\u3084\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u3092\u3088\u308a\u6df1\u304f\u7406\u89e3\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u6b21\u7ae0\u3067\u306f\u3001\u3053\u308c\u3089\u306e\u6a5f\u80fd\u3092\u5b9f\u969b\u306b\u6d3b\u7528\u3059\u308b\u305f\u3081\u306e\u958b\u767a\u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u65b9\u6cd5\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u898b\u3066\u3044\u304d\u307e\u3057\u3087\u3046\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-8\">\u958b\u767a\u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u624b\u9806<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-9\">Visual Studio \u3067\u306e OpenCV \u74b0\u5883\u69cb\u7bc9<\/h3>\n\n\n\n<p>Visual Studio\u3067\u52b9\u7387\u7684\u306bOpenCV\u3092\u5229\u7528\u3059\u308b\u305f\u3081\u306e\u74b0\u5883\u69cb\u7bc9\u624b\u9806\u3092\u8a73\u3057\u304f\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-10\">1. \u5fc5\u8981\u306a\u30c4\u30fc\u30eb\u306e\u6e96\u5099<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Visual Studio 2019\/2022\uff08Community Edition\u53ef\uff09<\/li>\n\n\n\n<li>OpenCV\u6700\u65b0\u7248\uff08\u57f7\u7b46\u6642\u70b9\u30674.8.0\uff09<\/li>\n\n\n\n<li>vcpkg\u30d1\u30c3\u30b1\u30fc\u30b8\u30de\u30cd\u30fc\u30b8\u30e3\u30fc\uff08\u63a8\u5968\uff09<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-11\">2. vcpkg\u3092\u4f7f\u7528\u3057\u305f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u624b\u9806<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># vcpkg\u306e\u30af\u30ed\u30fc\u30f3\u3068\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\ngit clone https:\/\/github.com\/Microsoft\/vcpkg.git\ncd vcpkg\n.\\bootstrap-vcpkg.bat\n\n# OpenCV\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\n.\\vcpkg install opencv4:x64-windows\n.\\vcpkg integrate install<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-12\">3. \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u8a2d\u5b9a<\/h4>\n\n\n\n<p>Visual Studio\u3067\u306e\u8a2d\u5b9a\u624b\u9806\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a4\u30f3\u30af\u30eb\u30fc\u30c9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30d7\u30ed\u30d1\u30c6\u30a3 \u2192 C\/C++ \u2192 \u5168\u822c \u2192 \u8ffd\u52a0\u306e\u30a4\u30f3\u30af\u30eb\u30fc\u30c9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea --&gt;\n$(VcpkgRoot)installed\\x64-windows\\include<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30e9\u30a4\u30d6\u30e9\u30ea\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u8a2d\u5b9a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30d7\u30ed\u30d1\u30c6\u30a3 \u2192 \u30ea\u30f3\u30ab\u30fc \u2192 \u5168\u822c \u2192 \u8ffd\u52a0\u306e\u30e9\u30a4\u30d6\u30e9\u30ea\u30c7\u30a3\u30ec\u30af\u30c8\u30ea --&gt;\n$(VcpkgRoot)installed\\x64-windows\\lib<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u4f9d\u5b58\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u8ffd\u52a0<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;!-- \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30d7\u30ed\u30d1\u30c6\u30a3 \u2192 \u30ea\u30f3\u30ab\u30fc \u2192 \u5165\u529b \u2192 \u8ffd\u52a0\u306e\u4f9d\u5b58\u30d5\u30a1\u30a4\u30eb --&gt;\nopencv_world480.lib\nopencv_world480d.lib  # \u30c7\u30d0\u30c3\u30b0\u30d3\u30eb\u30c9\u7528<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-13\">4. \u52d5\u4f5c\u78ba\u8a8d\u7528\u30b3\u30fc\u30c9<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;opencv2\/opencv.hpp&gt;\n#include &lt;iostream&gt;\n\nint main() {\n    \/\/ \u30d0\u30fc\u30b8\u30e7\u30f3\u78ba\u8a8d\n    std::cout &lt;&lt; \"OpenCV Version: \" &lt;&lt; CV_VERSION &lt;&lt; std::endl;\n\n    \/\/ \u753b\u50cf\u8aad\u307f\u8fbc\u307f\u30c6\u30b9\u30c8\n    cv::Mat image = cv::imread(\"test.jpg\");\n    if (image.empty()) {\n        std::cerr &lt;&lt; \"Error: Could not read the image.\" &lt;&lt; std::endl;\n        return -1;\n    }\n\n    \/\/ \u753b\u50cf\u8868\u793a\n    cv::imshow(\"Test Window\", image);\n    cv::waitKey(0);\n\n    return 0;\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-14\">CMake \u3092\u4f7f\u3063\u305f\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u958b\u767a\u74b0\u5883\u306e\u6e96\u5099<\/h3>\n\n\n\n<p>CMake\u3092\u4f7f\u7528\u3059\u308b\u3053\u3068\u3067\u3001\u8907\u6570\u306e\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3067\u540c\u3058\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u52b9\u7387\u7684\u306b\u7ba1\u7406\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-15\">1. CMake\u306e\u57fa\u672c\u8a2d\u5b9a<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># CMakeLists.txt\ncmake_minimum_required(VERSION 3.10)\nproject(OpenCVProject)\n\n# C++17\u3092\u4f7f\u7528\nset(CMAKE_CXX_STANDARD 17)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\n\n# OpenCV\u306e\u691c\u51fa\nfind_package(OpenCV REQUIRED)\ninclude_directories(${OpenCV_INCLUDE_DIRS})\n\n# \u5b9f\u884c\u30d5\u30a1\u30a4\u30eb\u306e\u4f5c\u6210\nadd_executable(${PROJECT_NAME} main.cpp)\ntarget_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-16\">2. \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30d3\u30eb\u30c9\u624b\u9806<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># \u30d3\u30eb\u30c9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u4f5c\u6210\u3068\u79fb\u52d5\nmkdir build &amp;&amp; cd build\n\n# CMake\u306e\u5b9f\u884c\ncmake ..\n\n# \u30d3\u30eb\u30c9\u306e\u5b9f\u884c\ncmake --build .<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-17\">\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u5225\u306e\u6ce8\u610f\u70b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Windows<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Visual Studio\u306e\u30b8\u30a7\u30cd\u30ec\u30fc\u30bf\u3092\u6307\u5b9a\ncmake -G \"Visual Studio 17 2022\" -A x64 ..<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>Linux<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># OpenCV\u306e\u4f9d\u5b58\u30d1\u30c3\u30b1\u30fc\u30b8\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\nsudo apt-get install libopencv-dev\n\n# \u30d3\u30eb\u30c9\ncmake ..\nmake<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>macOS<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"># Homebrew\u3067\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\nbrew install opencv\n\n# \u30d3\u30eb\u30c9\ncmake ..\nmake<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-18\">\u30c8\u30e9\u30d6\u30eb\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0<\/h4>\n\n\n\n<p>\u3088\u304f\u3042\u308b\u554f\u984c\u3068\u89e3\u6c7a\u65b9\u6cd5\uff1a<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30ea\u30f3\u30af\u30a8\u30e9\u30fc<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u539f\u56e0\uff1a\u30e9\u30a4\u30d6\u30e9\u30ea\u30d1\u30b9\u306e\u8a2d\u5b9a\u30df\u30b9<\/li>\n\n\n\n<li>\u89e3\u6c7a\uff1aCMake\u3067OpenCV_DIR\u5909\u6570\u3092\u660e\u793a\u7684\u306b\u8a2d\u5b9a<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">set(OpenCV_DIR \"path\/to\/opencv\/build\")<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30d0\u30fc\u30b8\u30e7\u30f3\u4e0d\u4e00\u81f4<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u539f\u56e0\uff1a\u30b7\u30b9\u30c6\u30e0\u306b\u8907\u6570\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/li>\n\n\n\n<li>\u89e3\u6c7a\uff1aCMake\u3067\u7279\u5b9a\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u6307\u5b9a<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">find_package(OpenCV 4.8 REQUIRED)<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u30e9\u30f3\u30bf\u30a4\u30e0\u30a8\u30e9\u30fc<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u539f\u56e0\uff1aDLL\u304c\u898b\u3064\u304b\u3089\u306a\u3044<\/li>\n\n\n\n<li>\u89e3\u6c7a\uff1a\u5b9f\u884c\u30d5\u30a1\u30a4\u30eb\u3068\u540c\u3058\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306bDLL\u3092\u30b3\u30d4\u30fc<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">copy \"$(OpenCV_DIR)\\bin\\*.dll\" \"$(OutDir)\"<\/pre>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u8a2d\u5b9a\u3092\u884c\u3046\u3053\u3068\u3067\u3001\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3067\u52d5\u4f5c\u3059\u308b\u5b89\u5b9a\u3057\u305f\u958b\u767a\u74b0\u5883\u3092\u69cb\u7bc9\u3067\u304d\u307e\u3059\u3002\u74b0\u5883\u69cb\u7bc9\u5f8c\u306f\u3001\u7d71\u5408\u958b\u767a\u74b0\u5883\uff08IDE\uff09\u306e\u30c7\u30d0\u30c3\u30b0\u6a5f\u80fd\u3084\u3001CMake\u306e\u30d3\u30eb\u30c9\u30b7\u30b9\u30c6\u30e0\u3092\u6d3b\u7528\u3057\u3066\u52b9\u7387\u7684\u306a\u958b\u767a\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-19\">\u753b\u50cf\u51e6\u7406\u306e\u57fa\u672c\u64cd\u4f5c\u30de\u30b9\u30bf\u30fc<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-20\">\u753b\u50cf\u306e\u8aad\u307f\u8fbc\u307f\u3068\u8868\u793a\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u57fa\u672c\u7684\u306a\u753b\u50cf\u64cd\u4f5c\u3092\u7fd2\u5f97\u3059\u308b\u3053\u3068\u306f\u3001OpenCV\u3092\u4f7f\u7528\u3057\u305f\u958b\u767a\u306e\u7b2c\u4e00\u6b69\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u4e3b\u8981\u306a\u64cd\u4f5c\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\u3092\u8aac\u660e\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-21\">1. \u753b\u50cf\u306e\u8aad\u307f\u8fbc\u307f\u3068\u57fa\u672c\u64cd\u4f5c<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;opencv2\/opencv.hpp&gt;\n#include &lt;iostream&gt;\n\nclass ImageHandler {\nprivate:\n    cv::Mat image;\n    std::string windowName;\n\npublic:\n    ImageHandler(const std::string&amp; filename, const std::string&amp; window = \"Image\") \n        : windowName(window) {\n        \/\/ \u753b\u50cf\u306e\u8aad\u307f\u8fbc\u307f\n        image = cv::imread(filename);\n\n        \/\/ \u30a8\u30e9\u30fc\u30c1\u30a7\u30c3\u30af\n        if (image.empty()) {\n            throw std::runtime_error(\"Failed to load image: \" + filename);\n        }\n    }\n\n    \/\/ \u753b\u50cf\u60c5\u5831\u306e\u8868\u793a\n    void printInfo() const {\n        std::cout &lt;&lt; \"\u753b\u50cf\u30b5\u30a4\u30ba: \" &lt;&lt; image.size() &lt;&lt; std::endl;\n        std::cout &lt;&lt; \"\u30c1\u30e3\u30f3\u30cd\u30eb\u6570: \" &lt;&lt; image.channels() &lt;&lt; std::endl;\n        std::cout &lt;&lt; \"\u30c7\u30fc\u30bf\u578b: \" &lt;&lt; image.type() &lt;&lt; std::endl;\n    }\n\n    \/\/ \u753b\u50cf\u306e\u8868\u793a\n    void display() const {\n        cv::imshow(windowName, image);\n        cv::waitKey(0);\n        cv::destroyWindow(windowName);\n    }\n\n    \/\/ \u753b\u50cf\u306e\u4fdd\u5b58\n    bool save(const std::string&amp; filename) const {\n        return cv::imwrite(filename, image);\n    }\n\n    \/\/ \u753b\u50cf\u306e\u53d6\u5f97\n    cv::Mat getImage() const {\n        return image.clone(); \/\/ \u5b89\u5168\u306e\u305f\u3081\u30b3\u30d4\u30fc\u3092\u8fd4\u3059\n    }\n};<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-22\">2. \u753b\u50cf\u306e\u30d4\u30af\u30bb\u30eb\u64cd\u4f5c<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u30d4\u30af\u30bb\u30eb\u5358\u4f4d\u306e\u64cd\u4f5c\u30af\u30e9\u30b9\nclass PixelOperator {\npublic:\n    \/\/ \u753b\u50cf\u306e\u660e\u308b\u3055\u8abf\u6574\n    static cv::Mat adjustBrightness(const cv::Mat&amp; input, double alpha, int beta) {\n        cv::Mat output;\n        input.convertTo(output, -1, alpha, beta);\n        return output;\n    }\n\n    \/\/ \u7279\u5b9a\u306e\u8272\u7bc4\u56f2\u306e\u62bd\u51fa\n    static cv::Mat extractColorRange(const cv::Mat&amp; input, \n                                   const cv::Scalar&amp; lower, \n                                   const cv::Scalar&amp; upper) {\n        cv::Mat hsv, mask;\n        cv::cvtColor(input, hsv, cv::COLOR_BGR2HSV);\n        cv::inRange(hsv, lower, upper, mask);\n        return mask;\n    }\n};<\/pre>\n\n\n\n<p>\u4f7f\u7528\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">try {\n    \/\/ \u753b\u50cf\u30cf\u30f3\u30c9\u30e9\u30fc\u306e\u4f5c\u6210\n    ImageHandler handler(\"sample.jpg\");\n    handler.printInfo();\n\n    \/\/ \u753b\u50cf\u306e\u660e\u308b\u3055\u8abf\u6574\n    cv::Mat brightImage = PixelOperator::adjustBrightness(\n        handler.getImage(), 1.5, 0);\n\n    \/\/ \u8d64\u8272\u7bc4\u56f2\u306e\u62bd\u51fa\n    cv::Mat redMask = PixelOperator::extractColorRange(\n        handler.getImage(),\n        cv::Scalar(160, 100, 100),\n        cv::Scalar(179, 255, 255)\n    );\n} catch (const std::exception&amp; e) {\n    std::cerr &lt;&lt; \"\u30a8\u30e9\u30fc: \" &lt;&lt; e.what() &lt;&lt; std::endl;\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-23\">\u753b\u50cf\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u3068\u52b9\u679c\u7684\u306a\u524d\u51e6\u7406\u30c6\u30af\u30cb\u30c3\u30af<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-24\">1. \u57fa\u672c\u7684\u306a\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u64cd\u4f5c<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ImageFilter {\npublic:\n    \/\/ \u30ac\u30a6\u30b7\u30a2\u30f3\u30d5\u30a3\u30eb\u30bf\u306e\u9069\u7528\n    static cv::Mat applyGaussianBlur(const cv::Mat&amp; input, \n                                    const cv::Size&amp; kernelSize, \n                                    double sigmaX) {\n        cv::Mat output;\n        cv::GaussianBlur(input, output, kernelSize, sigmaX);\n        return output;\n    }\n\n    \/\/ \u30e1\u30c7\u30a3\u30a2\u30f3\u30d5\u30a3\u30eb\u30bf\u306e\u9069\u7528\n    static cv::Mat applyMedianBlur(const cv::Mat&amp; input, int kernelSize) {\n        cv::Mat output;\n        cv::medianBlur(input, output, kernelSize);\n        return output;\n    }\n\n    \/\/ \u30d0\u30a4\u30e9\u30c6\u30e9\u30eb\u30d5\u30a3\u30eb\u30bf\u306e\u9069\u7528\n    static cv::Mat applyBilateralFilter(const cv::Mat&amp; input, \n                                       int diameter,\n                                       double sigmaColor,\n                                       double sigmaSpace) {\n        cv::Mat output;\n        cv::bilateralFilter(input, output, diameter, sigmaColor, sigmaSpace);\n        return output;\n    }\n};<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-25\">2. \u9ad8\u5ea6\u306a\u524d\u51e6\u7406\u30c6\u30af\u30cb\u30c3\u30af<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ImagePreprocessor {\npublic:\n    \/\/ \u30d2\u30b9\u30c8\u30b0\u30e9\u30e0\u5e73\u5766\u5316\n    static cv::Mat equalizeHistogram(const cv::Mat&amp; input) {\n        cv::Mat output;\n        if (input.channels() == 1) {\n            cv::equalizeHist(input, output);\n        } else {\n            cv::Mat ycrcb;\n            cv::cvtColor(input, ycrcb, cv::COLOR_BGR2YCrCb);\n            std::vector&lt;cv::Mat&gt; channels;\n            cv::split(ycrcb, channels);\n            cv::equalizeHist(channels[0], channels[0]);\n            cv::merge(channels, ycrcb);\n            cv::cvtColor(ycrcb, output, cv::COLOR_YCrCb2BGR);\n        }\n        return output;\n    }\n\n    \/\/ \u30a8\u30c3\u30b8\u691c\u51fa\n    static cv::Mat detectEdges(const cv::Mat&amp; input, \n                             double threshold1 = 100,\n                             double threshold2 = 200) {\n        cv::Mat edges;\n        cv::Canny(input, edges, threshold1, threshold2);\n        return edges;\n    }\n\n    \/\/ \u30ce\u30a4\u30ba\u9664\u53bb\u3068\u7279\u5fb4\u5f37\u8abf\n    static cv::Mat enhanceFeatures(const cv::Mat&amp; input) {\n        cv::Mat output;\n        \/\/ \u30ce\u30a4\u30ba\u9664\u53bb\n        output = ImageFilter::applyGaussianBlur(input, cv::Size(3, 3), 0);\n        \/\/ \u30b3\u30f3\u30c8\u30e9\u30b9\u30c8\u5f37\u8abf\n        cv::normalize(output, output, 0, 255, cv::NORM_MINMAX);\n        return output;\n    }\n};<\/pre>\n\n\n\n<p>\u5b9f\u8df5\u7684\u306a\u4f7f\u7528\u4f8b\uff1a<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">try {\n    ImageHandler handler(\"input.jpg\");\n    cv::Mat image = handler.getImage();\n\n    \/\/ \u30ce\u30a4\u30ba\u9664\u53bb\u3068\u30a8\u30c3\u30b8\u691c\u51fa\u306e\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\n    cv::Mat processed = image.clone();\n\n    \/\/ Step 1: \u30ce\u30a4\u30ba\u9664\u53bb\n    processed = ImageFilter::applyGaussianBlur(processed, cv::Size(3, 3), 0);\n\n    \/\/ Step 2: \u30d2\u30b9\u30c8\u30b0\u30e9\u30e0\u5e73\u5766\u5316\n    processed = ImagePreprocessor::equalizeHistogram(processed);\n\n    \/\/ Step 3: \u30a8\u30c3\u30b8\u691c\u51fa\n    processed = ImagePreprocessor::detectEdges(processed);\n\n    \/\/ \u7d50\u679c\u306e\u4fdd\u5b58\n    cv::imwrite(\"output.jpg\", processed);\n\n} catch (const std::exception&amp; e) {\n    std::cerr &lt;&lt; \"\u51e6\u7406\u30a8\u30e9\u30fc: \" &lt;&lt; e.what() &lt;&lt; std::endl;\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-26\">\u753b\u50cf\u51e6\u7406\u30d1\u30a4\u30d7\u30e9\u30a4\u30f3\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5e38\u306b\u753b\u50cf\u306e\u6709\u52b9\u6027\u3092\u30c1\u30a7\u30c3\u30af<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u4f8b\u5916\u51e6\u7406\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u30ea\u30fc\u30af\u306e\u9632\u6b62<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u4e0d\u5fc5\u8981\u306a\u30b3\u30d4\u30fc\u3092\u907f\u3051\u308b<\/li>\n\n\n\n<li>\u5927\u304d\u306a\u753b\u50cf\u306e\u5834\u5408\u306fROI\u3092\u4f7f\u7528<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30c7\u30fc\u30bf\u578b\u306e\u9078\u629e<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b9\u30de\u30fc\u30c8\u30dd\u30a4\u30f3\u30bf\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u306e\u9069\u5207\u306a\u89e3\u653e<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b3\u30fc\u30c9\u54c1\u8cea<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30af\u30e9\u30b9\u30d9\u30fc\u30b9\u306e\u8a2d\u8a08<\/li>\n\n\n\n<li>\u518d\u5229\u7528\u53ef\u80fd\u306a\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u5316<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-27\">\u5b9f\u8df5\u7684\u306a\u753b\u50cf\u51e6\u7406\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306e\u5b9f\u88c5<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-28\">\u9854\u691c\u51fa\u30b7\u30b9\u30c6\u30e0\u306e\u69cb\u7bc9\u624b\u9806<\/h3>\n\n\n\n<p>\u9854\u691c\u51fa\u306f\u5b9f\u8df5\u7684\u306a\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30d3\u30b8\u30e7\u30f3\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u4ee3\u8868\u7684\u306a\u4f8b\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001\u9ad8\u6027\u80fd\u306a\u9854\u691c\u51fa\u30b7\u30b9\u30c6\u30e0\u306e\u5b9f\u88c5\u65b9\u6cd5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-29\">1. \u30ab\u30b9\u30b1\u30fc\u30c9\u5206\u985e\u5668\u3092\u4f7f\u7528\u3057\u305f\u9854\u691c\u51fa<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;opencv2\/opencv.hpp&gt;\n#include &lt;memory&gt;\n#include &lt;vector&gt;\n\nclass FaceDetector {\nprivate:\n    cv::CascadeClassifier faceClassifier;\n    double scaleFactor;\n    int minNeighbors;\n    cv::Size minSize;\n    cv::Size maxSize;\n\npublic:\n    FaceDetector(const std::string&amp; cascadePath = \"haarcascade_frontalface_alt2.xml\",\n                 double scale = 1.1,\n                 int neighbors = 3,\n                 const cv::Size&amp; min = cv::Size(30, 30),\n                 const cv::Size&amp; max = cv::Size()) \n        : scaleFactor(scale)\n        , minNeighbors(neighbors)\n        , minSize(min)\n        , maxSize(max) {\n\n        if (!faceClassifier.load(cascadePath)) {\n            throw std::runtime_error(\"Failed to load cascade classifier\");\n        }\n    }\n\n    std::vector&lt;cv::Rect&gt; detectFaces(const cv::Mat&amp; image) {\n        std::vector&lt;cv::Rect&gt; faces;\n        cv::Mat grayImage;\n\n        \/\/ \u30b0\u30ec\u30fc\u30b9\u30b1\u30fc\u30eb\u5909\u63db\uff08\u5fc5\u8981\u306a\u5834\u5408\uff09\n        if (image.channels() &gt; 1) {\n            cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);\n        } else {\n            grayImage = image;\n        }\n\n        \/\/ \u30d2\u30b9\u30c8\u30b0\u30e9\u30e0\u5e73\u5761\u5316\u306b\u3088\u308b\u30b3\u30f3\u30c8\u30e9\u30b9\u30c8\u6539\u5584\n        cv::equalizeHist(grayImage, grayImage);\n\n        \/\/ \u9854\u691c\u51fa\u306e\u5b9f\u884c\n        faceClassifier.detectMultiScale(grayImage, faces, \n            scaleFactor, minNeighbors, 0, minSize, maxSize);\n\n        return faces;\n    }\n\n    \/\/ \u691c\u51fa\u7d50\u679c\u306e\u63cf\u753b\n    static cv::Mat drawDetections(const cv::Mat&amp; image, \n                                const std::vector&lt;cv::Rect&gt;&amp; faces) {\n        cv::Mat output = image.clone();\n        for (const auto&amp; face : faces) {\n            \/\/ \u9854\u9818\u57df\u306e\u77e9\u5f62\u63cf\u753b\n            cv::rectangle(output, face, cv::Scalar(0, 255, 0), 2);\n\n            \/\/ \u4fe1\u983c\u5ea6\u8868\u793a\u306a\u3069\u306e\u8ffd\u52a0\u60c5\u5831\n            std::string label = \"Face\";\n            cv::putText(output, label, \n                       cv::Point(face.x, face.y - 10),\n                       cv::FONT_HERSHEY_SIMPLEX, 0.5,\n                       cv::Scalar(0, 255, 0), 2);\n        }\n        return output;\n    }\n};\n\n\/\/ \u4f7f\u7528\u4f8b\nvoid processFaceDetection() {\n    try {\n        \/\/ \u30ab\u30e1\u30e9\u307e\u305f\u306f\u52d5\u753b\u30b9\u30c8\u30ea\u30fc\u30e0\u304b\u3089\u306e\u30ad\u30e3\u30d7\u30c1\u30e3\n        cv::VideoCapture cap(0);\n        if (!cap.isOpened()) {\n            throw std::runtime_error(\"Failed to open camera\");\n        }\n\n        FaceDetector detector;\n        cv::Mat frame;\n\n        while (true) {\n            cap &gt;&gt; frame;\n            if (frame.empty()) break;\n\n            \/\/ \u9854\u691c\u51fa\u306e\u5b9f\u884c\n            auto faces = detector.detectFaces(frame);\n\n            \/\/ \u691c\u51fa\u7d50\u679c\u306e\u63cf\u753b\n            auto output = FaceDetector::drawDetections(frame, faces);\n\n            \/\/ \u7d50\u679c\u306e\u8868\u793a\n            cv::imshow(\"Face Detection\", output);\n\n            \/\/ 'q'\u30ad\u30fc\u3067\u7d42\u4e86\n            if (cv::waitKey(1) == 'q') break;\n        }\n\n    } catch (const std::exception&amp; e) {\n        std::cerr &lt;&lt; \"Error: \" &lt;&lt; e.what() &lt;&lt; std::endl;\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-30\">\u7269\u4f53\u8ffd\u8de1\u6a5f\u80fd\u306e\u5b9f\u88c5\u65b9\u6cd5<\/h3>\n\n\n\n<p>\u7269\u4f53\u8ffd\u8de1\u306f\u52d5\u753b\u51e6\u7406\u306b\u304a\u3051\u308b\u91cd\u8981\u306a\u6a5f\u80fd\u3067\u3059\u3002\u4ee5\u4e0b\u306b\u3001KCF\u30c8\u30e9\u30c3\u30ab\u30fc\u3092\u4f7f\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u5b9f\u88c5\u3092\u793a\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ObjectTracker {\nprivate:\n    cv::Ptr&lt;cv::Tracker&gt; tracker;\n    cv::Rect2d boundingBox;\n    bool isInitialized;\n\npublic:\n    ObjectTracker() : isInitialized(false) {\n        \/\/ KCF\u30c8\u30e9\u30c3\u30ab\u30fc\u306e\u521d\u671f\u5316\n        tracker = cv::TrackerKCF::create();\n    }\n\n    bool initialize(const cv::Mat&amp; frame, const cv::Rect2d&amp; box) {\n        if (frame.empty()) return false;\n\n        boundingBox = box;\n        isInitialized = tracker-&gt;init(frame, boundingBox);\n        return isInitialized;\n    }\n\n    bool update(const cv::Mat&amp; frame) {\n        if (!isInitialized || frame.empty()) return false;\n        return tracker-&gt;update(frame, boundingBox);\n    }\n\n    cv::Rect2d getBoundingBox() const {\n        return boundingBox;\n    }\n\n    void reset() {\n        tracker = cv::TrackerKCF::create();\n        isInitialized = false;\n    }\n};\n\n\/\/ \u30de\u30eb\u30c1\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u8ffd\u8de1\u30b7\u30b9\u30c6\u30e0\nclass MultiObjectTracker {\nprivate:\n    std::vector&lt;std::unique_ptr&lt;ObjectTracker&gt;&gt; trackers;\n    std::vector&lt;cv::Scalar&gt; colors;\n\npublic:\n    MultiObjectTracker() {\n        \/\/ \u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u5bfe\u8c61\u3054\u3068\u306b\u7570\u306a\u308b\u8272\u3092\u8a2d\u5b9a\n        colors = {\n            cv::Scalar(255, 0, 0),   \/\/ \u9752\n            cv::Scalar(0, 255, 0),   \/\/ \u7dd1\n            cv::Scalar(0, 0, 255),   \/\/ \u8d64\n            cv::Scalar(255, 255, 0)  \/\/ \u9ec4\n        };\n    }\n\n    void addObject(const cv::Mat&amp; frame, const cv::Rect2d&amp; box) {\n        auto tracker = std::make_unique&lt;ObjectTracker&gt;();\n        if (tracker-&gt;initialize(frame, box)) {\n            trackers.push_back(std::move(tracker));\n        }\n    }\n\n    void update(const cv::Mat&amp; frame) {\n        for (auto it = trackers.begin(); it != trackers.end();) {\n            if (!(*it)-&gt;update(frame)) {\n                it = trackers.erase(it);\n            } else {\n                ++it;\n            }\n        }\n    }\n\n    cv::Mat drawTracking(const cv::Mat&amp; frame) {\n        cv::Mat output = frame.clone();\n        for (size_t i = 0; i &lt; trackers.size(); ++i) {\n            auto box = trackers[i]-&gt;getBoundingBox();\n            cv::rectangle(output, box, colors[i % colors.size()], 2);\n\n            \/\/ \u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u60c5\u5831\u306e\u8868\u793a\n            std::string label = \"Object \" + std::to_string(i + 1);\n            cv::putText(output, label, \n                       cv::Point(box.x, box.y - 10),\n                       cv::FONT_HERSHEY_SIMPLEX, 0.5,\n                       colors[i % colors.size()], 2);\n        }\n        return output;\n    }\n};\n\n\/\/ \u5b9f\u88c5\u4f8b\nvoid processObjectTracking() {\n    try {\n        cv::VideoCapture cap(0);\n        if (!cap.isOpened()) {\n            throw std::runtime_error(\"Failed to open camera\");\n        }\n\n        MultiObjectTracker tracker;\n        cv::Mat frame;\n        bool selectObject = false;\n        cv::Rect2d box;\n\n        while (true) {\n            cap &gt;&gt; frame;\n            if (frame.empty()) break;\n\n            if (selectObject) {\n                \/\/ ROI\u306e\u9078\u629e\n                box = cv::selectROI(\"Tracking\", frame);\n                tracker.addObject(frame, box);\n                selectObject = false;\n            }\n\n            \/\/ \u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u306e\u66f4\u65b0\u3068\u63cf\u753b\n            tracker.update(frame);\n            auto output = tracker.drawTracking(frame);\n\n            cv::imshow(\"Tracking\", output);\n\n            char key = (char)cv::waitKey(1);\n            if (key == 'q') break;\n            if (key == 's') selectObject = true;\n        }\n\n    } catch (const std::exception&amp; e) {\n        std::cerr &lt;&lt; \"Error: \" &lt;&lt; e.what() &lt;&lt; std::endl;\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-31\">\u5b9f\u88c5\u4e0a\u306e\u6ce8\u610f\u70b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ROI\uff08Region of Interest\uff09\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u753b\u50cf\u30b5\u30a4\u30ba\u306e\u9078\u629e<\/li>\n\n\n\n<li>\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u51e6\u7406\u306e\u5c0e\u5165<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u753b\u50cf\u5165\u529b\u306e\u691c\u8a3c<\/li>\n\n\n\n<li>\u30c8\u30e9\u30c3\u30ad\u30f3\u30b0\u5931\u6557\u6642\u306e\u9069\u5207\u306a\u51e6\u7406<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406\u306e\u5fb9\u5e95<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b9\u30de\u30fc\u30c8\u30dd\u30a4\u30f3\u30bf\u306e\u4f7f\u7528<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u306e\u9069\u5207\u306a\u89e3\u653e<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u30ea\u30fc\u30af\u306e\u9632\u6b62<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u62e1\u5f35\u6027<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u3055\u308c\u305f\u8a2d\u8a08<\/li>\n\n\n\n<li>\u8a2d\u5b9a\u306e\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u6a5f\u80fd<\/li>\n\n\n\n<li>\u65b0\u3057\u3044\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306e\u8ffd\u52a0\u5bb9\u6613\u6027<\/li>\n<\/ul>\n\n\n\n<p>\u3053\u308c\u3089\u306e\u5b9f\u88c5\u306b\u3088\u308a\u3001\u5b9f\u7528\u7684\u306a\u753b\u50cf\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u30b7\u30b9\u30c6\u30e0\u306e\u8981\u4ef6\u306b\u5fdc\u3058\u3066\u3001\u691c\u51fa\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u3084\u30d1\u30e9\u30e1\u30fc\u30bf\u3092\u8abf\u6574\u3059\u308b\u3053\u3068\u3067\u3001\u3088\u308a\u9ad8\u7cbe\u5ea6\u306a\u51e6\u7406\u304c\u53ef\u80fd\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-32\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-33\">\u30e1\u30e2\u30ea\u7ba1\u7406\u3068\u51e6\u7406\u901f\u5ea6\u306e\u6539\u5584\u624b\u6cd5<\/h3>\n\n\n\n<p>OpenCV\u3092\u4f7f\u7528\u3057\u305f\u753b\u50cf\u51e6\u7406\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u6700\u5927\u9650\u306b\u5f15\u304d\u51fa\u3059\u305f\u3081\u306e\u6700\u9069\u5316\u624b\u6cd5\u3092\u89e3\u8aac\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-34\">1. \u30e1\u30e2\u30ea\u7ba1\u7406\u306e\u6700\u9069\u5316<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class OptimizedImageProcessor {\nprivate:\n    \/\/ \u30e1\u30e2\u30ea\u30d7\u30fc\u30eb\u7528\u306e\u30ad\u30e3\u30c3\u30b7\u30e5\n    std::vector&lt;cv::Mat&gt; matPool;\n    const size_t maxPoolSize = 10;\n    std::mutex poolMutex;\n\npublic:\n    \/\/ \u30e1\u30e2\u30ea\u30d7\u30fc\u30eb\u304b\u3089Mat\u3092\u53d6\u5f97\n    cv::Mat acquireMat() {\n        std::lock_guard&lt;std::mutex&gt; lock(poolMutex);\n        if (!matPool.empty()) {\n            cv::Mat mat = std::move(matPool.back());\n            matPool.pop_back();\n            return mat;\n        }\n        return cv::Mat();\n    }\n\n    \/\/ \u4f7f\u7528\u6e08\u307fMat\u3092\u30d7\u30fc\u30eb\u306b\u8fd4\u5374\n    void releaseMat(cv::Mat&amp; mat) {\n        std::lock_guard&lt;std::mutex&gt; lock(poolMutex);\n        if (matPool.size() &lt; maxPoolSize) {\n            mat.release();\n            matPool.push_back(std::move(mat));\n        }\n    }\n\n    \/\/ \u6700\u9069\u5316\u3055\u308c\u305f\u753b\u50cf\u51e6\u7406\u4f8b\n    cv::Mat processImageOptimized(const cv::Mat&amp; input) {\n        \/\/ ROI\u3092\u4f7f\u7528\u3057\u305f\u52b9\u7387\u7684\u306a\u51e6\u7406\n        cv::Mat roi = input(cv::Rect(0, 0, input.cols\/2, input.rows\/2));\n\n        \/\/ \u9023\u7d9a\u30e1\u30e2\u30ea\u9818\u57df\u306e\u78ba\u4fdd\n        if (!roi.isContinuous()) {\n            roi = roi.clone();\n        }\n\n        \/\/ \u30e1\u30e2\u30ea\u30a2\u30e9\u30a4\u30e1\u30f3\u30c8\u3092\u8003\u616e\u3057\u305f\u51e6\u7406\n        cv::Mat output;\n        output.create(roi.size(), roi.type());\n\n        \/\/ SIMD\u547d\u4ee4\u306e\u6d3b\u7528\n        cv::parallel_for_(cv::Range(0, roi.rows), [&amp;](const cv::Range&amp; range) {\n            for (int r = range.start; r &lt; range.end; r++) {\n                \/\/ \u30dd\u30a4\u30f3\u30bf\u3092\u4f7f\u7528\u3057\u305f\u76f4\u63a5\u30e1\u30e2\u30ea\u30a2\u30af\u30bb\u30b9\n                uchar* pSrc = roi.ptr&lt;uchar&gt;(r);\n                uchar* pDst = output.ptr&lt;uchar&gt;(r);\n                for (int c = 0; c &lt; roi.cols * roi.channels(); c++) {\n                    pDst[c] = saturate_cast&lt;uchar&gt;(pSrc[c] * 1.5);\n                }\n            }\n        });\n\n        return output;\n    }\n};<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-35\">2. \u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6e2c\u5b9a\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class PerformanceMonitor {\nprivate:\n    using Clock = std::chrono::high_resolution_clock;\n    using TimePoint = Clock::time_point;\n    using Duration = std::chrono::microseconds;\n\n    struct Measurement {\n        Duration duration;\n        size_t memoryUsage;\n    };\n\n    std::unordered_map&lt;std::string, std::vector&lt;Measurement&gt;&gt; measurements;\n\npublic:\n    \/\/ \u51e6\u7406\u6642\u9593\u3068\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u8a08\u6e2c\n    template&lt;typename Func&gt;\n    auto measurePerformance(const std::string&amp; operationName, Func&amp;&amp; func) {\n        auto start = Clock::now();\n        size_t initialMemory = cv::utils::getMemoryUsage();\n\n        auto result = std::forward&lt;Func&gt;(func)();\n\n        size_t finalMemory = cv::utils::getMemoryUsage();\n        auto end = Clock::now();\n\n        Measurement m{\n            std::chrono::duration_cast&lt;Duration&gt;(end - start),\n            finalMemory - initialMemory\n        };\n        measurements[operationName].push_back(m);\n\n        return result;\n    }\n\n    \/\/ \u7d71\u8a08\u60c5\u5831\u306e\u51fa\u529b\n    void printStatistics() const {\n        for (const auto&amp; [name, measures] : measurements) {\n            Duration totalDuration{0};\n            size_t totalMemory = 0;\n\n            for (const auto&amp; m : measures) {\n                totalDuration += m.duration;\n                totalMemory += m.memoryUsage;\n            }\n\n            std::cout &lt;&lt; \"Operation: \" &lt;&lt; name &lt;&lt; \"\\n\"\n                     &lt;&lt; \"Average Time: \" \n                     &lt;&lt; totalDuration.count() \/ measures.size() \n                     &lt;&lt; \"\u00b5s\\n\"\n                     &lt;&lt; \"Average Memory: \" \n                     &lt;&lt; totalMemory \/ measures.size() \n                     &lt;&lt; \" bytes\\n\\n\";\n        }\n    }\n};<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-36\">\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u3092\u6d3b\u7528\u3057\u305f\u4e26\u5217\u51e6\u7406\u306e\u5b9f\u88c5<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-37\">1. \u30b9\u30ec\u30c3\u30c9\u30d7\u30fc\u30eb\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ThreadPool {\nprivate:\n    std::vector&lt;std::thread&gt; workers;\n    std::queue&lt;std::function&lt;void()&gt;&gt; tasks;\n    std::mutex queueMutex;\n    std::condition_variable condition;\n    bool stop;\n\npublic:\n    ThreadPool(size_t threads) : stop(false) {\n        for (size_t i = 0; i &lt; threads; ++i) {\n            workers.emplace_back([this] {\n                while (true) {\n                    std::function&lt;void()&gt; task;\n                    {\n                        std::unique_lock&lt;std::mutex&gt; lock(queueMutex);\n                        condition.wait(lock, [this] {\n                            return stop || !tasks.empty();\n                        });\n                        if (stop &amp;&amp; tasks.empty()) return;\n                        task = std::move(tasks.front());\n                        tasks.pop();\n                    }\n                    task();\n                }\n            });\n        }\n    }\n\n    template&lt;class F&gt;\n    void enqueue(F&amp;&amp; f) {\n        {\n            std::unique_lock&lt;std::mutex&gt; lock(queueMutex);\n            tasks.emplace(std::forward&lt;F&gt;(f));\n        }\n        condition.notify_one();\n    }\n\n    ~ThreadPool() {\n        {\n            std::unique_lock&lt;std::mutex&gt; lock(queueMutex);\n            stop = true;\n        }\n        condition.notify_all();\n        for (std::thread&amp; worker : workers) {\n            worker.join();\n        }\n    }\n};<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-38\">2. \u4e26\u5217\u753b\u50cf\u51e6\u7406\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">class ParallelImageProcessor {\nprivate:\n    ThreadPool pool;\n    const size_t tileSize = 256;  \/\/ \u30bf\u30a4\u30eb\u30b5\u30a4\u30ba\n\npublic:\n    ParallelImageProcessor(size_t threadCount = std::thread::hardware_concurrency())\n        : pool(threadCount) {}\n\n    cv::Mat processTiled(const cv::Mat&amp; input, \n                        std::function&lt;void(cv::Mat&amp;)&gt; processor) {\n        cv::Mat output = input.clone();\n        std::vector&lt;std::future&lt;void&gt;&gt; futures;\n\n        \/\/ \u753b\u50cf\u3092\u5c0f\u3055\u306a\u30bf\u30a4\u30eb\u306b\u5206\u5272\u3057\u3066\u4e26\u5217\u51e6\u7406\n        for (int y = 0; y &lt; input.rows; y += tileSize) {\n            for (int x = 0; x &lt; input.cols; x += tileSize) {\n                \/\/ \u30bf\u30a4\u30eb\u30b5\u30a4\u30ba\u306e\u8a08\u7b97\n                int tileWidth = std::min(tileSize, input.cols - x);\n                int tileHeight = std::min(tileSize, input.rows - y);\n\n                \/\/ \u30bf\u30a4\u30eb\u306eROI\u3092\u4f5c\u6210\n                cv::Rect tileRect(x, y, tileWidth, tileHeight);\n\n                \/\/ \u30bf\u30a4\u30eb\u306e\u51e6\u7406\u3092\u30b9\u30ec\u30c3\u30c9\u30d7\u30fc\u30eb\u306b\u8ffd\u52a0\n                futures.push_back(std::async(std::launch::async, [&amp;, tileRect]() {\n                    cv::Mat tile = output(tileRect);\n                    processor(tile);\n                }));\n            }\n        }\n\n        \/\/ \u3059\u3079\u3066\u306e\u51e6\u7406\u306e\u5b8c\u4e86\u3092\u5f85\u6a5f\n        for (auto&amp; future : futures) {\n            future.wait();\n        }\n\n        return output;\n    }\n};\n\n\/\/ \u4f7f\u7528\u4f8b\nvoid demonstrateParallelProcessing() {\n    cv::Mat input = cv::imread(\"large_image.jpg\");\n    ParallelImageProcessor processor(8);  \/\/ 8\u30b9\u30ec\u30c3\u30c9\u4f7f\u7528\n\n    \/\/ \u30ac\u30a6\u30b7\u30a2\u30f3\u30d6\u30e9\u30fc\u51e6\u7406\u3092\u4e26\u5217\u5316\n    auto output = processor.processTiled(input, [](cv::Mat&amp; tile) {\n        cv::GaussianBlur(tile, tile, cv::Size(5, 5), 0);\n    });\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-39\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316\u306e\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30e1\u30e2\u30ea\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u5272\u308a\u5f53\u3066\u306e\u6700\u5c0f\u5316<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u30d7\u30fc\u30eb\u306e\u4f7f\u7528<\/li>\n\n\n\n<li>\u9023\u7d9a\u30e1\u30e2\u30ea\u9818\u57df\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>ROI\u306e\u52b9\u679c\u7684\u306a\u4f7f\u7528<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>CPU\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SIMD\u30a4\u30f3\u30b9\u30c8\u30e9\u30af\u30b7\u30e7\u30f3\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u30ad\u30e3\u30c3\u30b7\u30e5\u30d5\u30ec\u30f3\u30c9\u30ea\u30fc\u306a\u5b9f\u88c5<\/li>\n\n\n\n<li>\u30eb\u30fc\u30d7\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u6761\u4ef6\u5206\u5c90\u306e\u6700\u5c0f\u5316<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u4e26\u5217\u51e6\u7406\u306e\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9069\u5207\u306a\u30bf\u30a4\u30eb\u30b5\u30a4\u30ba\u306e\u9078\u629e<\/li>\n\n\n\n<li>\u30b9\u30ec\u30c3\u30c9\u6570\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30bf\u30b9\u30af\u306e\u7c92\u5ea6\u8abf\u6574<\/li>\n\n\n\n<li>\u30b9\u30ec\u30c3\u30c9\u30bb\u30fc\u30d5\u306a\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u305d\u306e\u4ed6\u306e\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306e\u9078\u629e<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u69cb\u9020\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30c1\u30a7\u30c3\u30af\u306e\u52b9\u7387\u5316<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u89e3\u653e\u306e\u9069\u5207\u306a\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-40\">\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6bd4\u8f03\u8868<\/h4>\n\n\n<div id=\"id-b212c023-b47f-47c3-ab61-ce22024d2fd3\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6700\u9069\u5316\u624b\u6cd5<\/th><th>\u51e6\u7406\u6642\u9593\u6539\u5584\u7387<\/th><th>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u524a\u6e1b\u7387<\/th><\/tr><\/thead><tbody><tr><td>\u30e1\u30e2\u30ea\u30d7\u30fc\u30eb\u4f7f\u7528<\/td><td>15-20%<\/td><td>30-40%<\/td><\/tr><tr><td>ROI\u6700\u9069\u5316<\/td><td>10-15%<\/td><td>20-25%<\/td><\/tr><tr><td>SIMD\u6d3b\u7528<\/td><td>40-50%<\/td><td>\u2013<\/td><\/tr><tr><td>\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u5316<\/td><td>60-70%<\/td><td>\u2013<\/td><\/tr><tr><td>\u30bf\u30a4\u30eb\u51e6\u7406<\/td><td>30-35%<\/td><td>15-20%<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<p>\u3053\u308c\u3089\u306e\u6700\u9069\u5316\u624b\u6cd5\u3092\u9069\u5207\u306b\u7d44\u307f\u5408\u308f\u305b\u308b\u3053\u3068\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u6027\u80fd\u3092\u5927\u5e45\u306b\u6539\u5584\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u305f\u3060\u3057\u3001\u6700\u9069\u5316\u306e\u9069\u7528\u306f\u5e38\u306b\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0\u7d50\u679c\u306b\u57fa\u3065\u3044\u3066\u884c\u3044\u3001\u5b9f\u969b\u306e\u6027\u80fd\u5411\u4e0a\u3092\u78ba\u8a8d\u3059\u308b\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-41\">\u753b\u50cf\u8a8d\u8b58\u3092\u7528\u3044\u305f\u81ea\u52d5\u5316\u30b7\u30b9\u30c6\u30e0\u306e\u69cb\u7bc9<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-42\">Part 1: \u30b3\u30a2\u30b7\u30b9\u30c6\u30e0\u306e\u57fa\u672c\u69cb\u9020<\/h4>\n\n\n\n<p>\u88fd\u9020\u30e9\u30a4\u30f3\u306b\u304a\u3051\u308b\u88fd\u54c1\u691c\u67fb\u3092\u81ea\u52d5\u5316\u3059\u308b\u753b\u50cf\u8a8d\u8b58\u30b7\u30b9\u30c6\u30e0\u306e\u57fa\u672c\u69cb\u9020\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002\u3053\u306e\u30d1\u30fc\u30c8\u3067\u306f\u4ee5\u4e0b\u306e\u6a5f\u80fd\u3092\u63d0\u4f9b\u3057\u307e\u3059\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30b7\u30b9\u30c6\u30e0\u306e\u57fa\u672c\u69cb\u9020\u306e\u5b9a\u7fa9<\/li>\n\n\n\n<li>\u30c7\u30fc\u30bf\u69cb\u9020\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u57fa\u672c\u7684\u306a\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n<\/ul>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;opencv2\/opencv.hpp&gt;\n#include &lt;memory&gt;\n#include &lt;vector&gt;\n#include &lt;deque&gt;\n#include &lt;filesystem&gt;\n#include &lt;fstream&gt;\n#include &lt;json.hpp&gt;\n\nusing json = nlohmann::json;\n\n\/\/ \u88fd\u54c1\u4ed5\u69d8\u306e\u5b9a\u7fa9\nstruct ProductSpecification {\n    struct Dimensions {\n        double minWidth;\n        double maxWidth;\n        double minHeight;\n        double maxHeight;\n    };\n\n    struct ColorSpec {\n        cv::Scalar targetColor;\n        double tolerance;\n    };\n\n    struct QualityThresholds {\n        double minSurfaceQuality;\n        double maxDefectSize;\n        int maxDefectCount;\n    };\n\n    Dimensions dimensions;\n    std::vector&lt;ColorSpec&gt; allowedColors;\n    QualityThresholds quality;\n    cv::Mat referenceImage;\n};\n\n\/\/ \u691c\u67fb\u7d50\u679c\u306e\u69cb\u9020\u4f53\nstruct InspectionResult {\n    bool passed;\n    std::string failureReason;\n    std::vector&lt;cv::Point2f&gt; defectLocations;\n    double qualityScore;\n    std::chrono::system_clock::time_point timestamp;\n\n    \/\/ JSON\u5f62\u5f0f\u3067\u306e\u30b7\u30ea\u30a2\u30e9\u30a4\u30ba\n    json toJson() const {\n        json j;\n        j[\"passed\"] = passed;\n        j[\"failureReason\"] = failureReason;\n        j[\"qualityScore\"] = qualityScore;\n        j[\"timestamp\"] = std::chrono::system_clock::to_time_t(timestamp);\n        return j;\n    }\n};\n\n\/\/ \u691c\u67fb\u30b7\u30b9\u30c6\u30e0\u306e\u57fa\u672c\u30af\u30e9\u30b9\nclass AutomatedInspectionSystem {\nprivate:\n    ProductSpecification spec;\n    cv::Ptr&lt;cv::Feature2D&gt; featureDetector;\n    std::deque&lt;InspectionResult&gt; recentResults;\n    const size_t maxResultsHistory = 1000;\n    std::mutex resultsMutex;\n\n    struct Statistics {\n        std::atomic&lt;int&gt; totalInspected{0};\n        std::atomic&lt;int&gt; totalPassed{0};\n        std::atomic&lt;int&gt; totalFailed{0};\n    } stats;\n\npublic:\n    AutomatedInspectionSystem(const ProductSpecification&amp; specification)\n        : spec(specification) {\n        initializeSystem();\n    }\n\n    \/\/ \u521d\u671f\u5316\u51e6\u7406\n    void initializeSystem() {\n        try {\n            featureDetector = cv::AKAZE::create();\n            setupDirectories();\n            validateConfiguration();\n        } catch (const std::exception&amp; e) {\n            throw std::runtime_error(\"System initialization failed: \" + \n                                   std::string(e.what()));\n        }\n    }\n\nprotected:\n    \/\/ \u5171\u901a\u306e\u30e6\u30fc\u30c6\u30a3\u30ea\u30c6\u30a3\u95a2\u6570\n    void setupDirectories() {\n        std::filesystem::create_directories(\"inspection_logs\");\n        std::filesystem::create_directories(\"inspection_images\");\n    }\n\n    void validateConfiguration() {\n        if (spec.dimensions.minWidth &lt;= 0 || spec.dimensions.maxWidth &lt;= 0 ||\n            spec.dimensions.minHeight &lt;= 0 || spec.dimensions.maxHeight &lt;= 0) {\n            throw std::invalid_argument(\"Invalid dimension specifications\");\n        }\n\n        if (spec.allowedColors.empty()) {\n            throw std::invalid_argument(\"No color specifications provided\");\n        }\n\n        if (spec.referenceImage.empty()) {\n            throw std::invalid_argument(\"No reference image provided\");\n        }\n    }\n\n    \/\/ \u57fa\u672c\u7684\u306a\u753b\u50cf\u51e6\u7406\u6a5f\u80fd\n    void preprocessImage(const cv::Mat&amp; input, cv::Mat&amp; output) {\n        try {\n            \/\/ \u30ce\u30a4\u30ba\u9664\u53bb\n            cv::GaussianBlur(input, output, cv::Size(3, 3), 0);\n\n            \/\/ \u30b3\u30f3\u30c8\u30e9\u30b9\u30c8\u6b63\u898f\u5316\n            cv::normalize(output, output, 0, 255, cv::NORM_MINMAX);\n\n            \/\/ \u30b7\u30e3\u30fc\u30d7\u30cb\u30f3\u30b0\n            cv::Mat kernel = (cv::Mat_&lt;float&gt;(3,3) &lt;&lt;\n                -1, -1, -1,\n                -1,  9, -1,\n                -1, -1, -1);\n            cv::filter2D(output, output, -1, kernel);\n        } catch (const cv::Exception&amp; e) {\n            throw std::runtime_error(\"Image preprocessing failed: \" + \n                                   std::string(e.what()));\n        }\n    }\n\n    \/\/ \u7d50\u679c\u306e\u4fdd\u5b58\u3068\u7ba1\u7406\n    void saveResult(const InspectionResult&amp; result) {\n        try {\n            json j = result.toJson();\n            std::string timestamp = std::to_string(\n                std::chrono::system_clock::to_time_t(result.timestamp));\n\n            std::string filename = \"inspection_logs\/result_\" + timestamp + \".json\";\n            std::ofstream file(filename);\n            file &lt;&lt; j.dump(4);\n        } catch (const std::exception&amp; e) {\n            std::cerr &lt;&lt; \"Failed to save inspection result: \" &lt;&lt; e.what() &lt;&lt; std::endl;\n        }\n    }\n\n    void updateStatistics(const InspectionResult&amp; result) {\n        stats.totalInspected++;\n        if (result.passed) {\n            stats.totalPassed++;\n        } else {\n            stats.totalFailed++;\n        }\n\n        {\n            std::lock_guard&lt;std::mutex&gt; lock(resultsMutex);\n            recentResults.push_back(result);\n            if (recentResults.size() &gt; maxResultsHistory) {\n                recentResults.pop_front();\n            }\n        }\n    }\n};\n\n\/\/ \u30b3\u30f3\u30d5\u30a3\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u30de\u30cd\u30fc\u30b8\u30e3\u30fc\nclass ConfigurationManager {\npublic:\n    static ProductSpecification loadConfiguration(const std::string&amp; configFile) {\n        try {\n            std::ifstream file(configFile);\n            json j;\n            file &gt;&gt; j;\n\n            ProductSpecification spec;\n            spec.dimensions = {\n                j[\"dimensions\"][\"minWidth\"],\n                j[\"dimensions\"][\"maxWidth\"],\n                j[\"dimensions\"][\"minHeight\"],\n                j[\"dimensions\"][\"maxHeight\"]\n            };\n\n            for (const auto&amp; color : j[\"allowedColors\"]) {\n                spec.allowedColors.push_back({\n                    cv::Scalar(\n                        color[\"h\"],\n                        color[\"s\"],\n                        color[\"v\"]\n                    ),\n                    color[\"tolerance\"]\n                });\n            }\n\n            spec.quality = {\n                j[\"quality\"][\"minSurfaceQuality\"],\n                j[\"quality\"][\"maxDefectSize\"],\n                j[\"quality\"][\"maxDefectCount\"]\n            };\n\n            return spec;\n        } catch (const std::exception&amp; e) {\n            throw std::runtime_error(\"Configuration loading failed: \" + \n                                   std::string(e.what()));\n        }\n    }\n};<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-43\">\u30b7\u30b9\u30c6\u30e0\u306e\u4e3b\u306a\u7279\u5fb4\uff1a<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5805\u7262\u306a\u57fa\u672c\u69cb\u9020<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u660e\u78ba\u306a\u8cac\u4efb\u5206\u62c5<\/li>\n\n\n\n<li>\u9069\u5207\u306a\u30ab\u30d7\u30bb\u30eb\u5316<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u8a2d\u5b9a\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>JSON\u5f62\u5f0f\u3067\u306e\u8a2d\u5b9a<\/li>\n\n\n\n<li>\u8a2d\u5b9a\u306e\u691c\u8a3c\u6a5f\u80fd<\/li>\n\n\n\n<li>\u67d4\u8edf\u306a\u30d1\u30e9\u30e1\u30fc\u30bf\u8abf\u6574<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30c7\u30fc\u30bf\u69cb\u9020\u306e\u8a2d\u8a08<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u52b9\u7387\u7684\u306a\u30e1\u30e2\u30ea\u7ba1\u7406<\/li>\n\n\n\n<li>\u30b9\u30ec\u30c3\u30c9\u30bb\u30fc\u30d5\u306a\u5b9f\u88c5<\/li>\n\n\n\n<li>\u62e1\u5f35\u6027\u306e\u78ba\u4fdd<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u672c\u6a5f\u80fd\u306e\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u753b\u50cf\u524d\u51e6\u7406<\/li>\n\n\n\n<li>\u7d50\u679c\u4fdd\u5b58<\/li>\n\n\n\n<li>\u7d71\u8a08\u60c5\u5831\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-44\">Part 2: \u691c\u67fb\u3068\u5206\u6790\u6a5f\u80fd\u306e\u5b9f\u88c5<\/h4>\n\n\n\n<p>\u524d\u56de\u5b9f\u88c5\u3057\u305f\u57fa\u672c\u69cb\u9020\u3092\u57fa\u306b\u3001\u5177\u4f53\u7684\u306a\u691c\u67fb\u3068\u5206\u6790\u6a5f\u80fd\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u691c\u67fb\u6a5f\u80fd\u3092\u5b9f\u88c5\u3057\u305f\u30af\u30e9\u30b9\nclass InspectionProcessor : public AutomatedInspectionSystem {\nprivate:\n    cv::Ptr&lt;cv::QRCodeDetector&gt; qrDetector;\n    cv::Ptr&lt;cv::CLAHE&gt; clahe;  \/\/ \u30b3\u30f3\u30c8\u30e9\u30b9\u30c8\u5f37\u8abf\u7528\n\npublic:\n    InspectionProcessor(const ProductSpecification&amp; spec)\n        : AutomatedInspectionSystem(spec) {\n        qrDetector = cv::QRCodeDetector::create();\n        clahe = cv::createCLAHE(2.0, cv::Size(8, 8));\n    }\n\n    InspectionResult inspectProduct(const cv::Mat&amp; image) {\n        InspectionResult result;\n        result.timestamp = std::chrono::system_clock::now();\n        result.passed = true;\n\n        try {\n            cv::Mat processedImage;\n            preprocessImage(image, processedImage);\n\n            \/\/ \u5404\u691c\u67fb\u9805\u76ee\u306e\u5b9f\u884c\n            if (!checkDimensions(processedImage, result)) return result;\n            if (!checkColor(processedImage, result)) return result;\n            if (!detectDefects(processedImage, result)) return result;\n            if (!verifyProductCode(processedImage, result)) return result;\n\n            \/\/ \u54c1\u8cea\u30b9\u30b3\u30a2\u306e\u8a08\u7b97\n            result.qualityScore = calculateQualityScore(processedImage, result);\n\n            \/\/ \u7d50\u679c\u306e\u4fdd\u5b58\u3068\u7d71\u8a08\u66f4\u65b0\n            updateStatistics(result);\n            saveResult(result);\n\n        } catch (const cv::Exception&amp; e) {\n            result.passed = false;\n            result.failureReason = \"OpenCV error: \" + std::string(e.what());\n        } catch (const std::exception&amp; e) {\n            result.passed = false;\n            result.failureReason = \"Processing error: \" + std::string(e.what());\n        }\n\n        return result;\n    }\n\nprivate:\n    bool checkDimensions(const cv::Mat&amp; image, InspectionResult&amp; result) {\n        cv::Mat binary;\n        cv::cvtColor(image, binary, cv::COLOR_BGR2GRAY);\n        clahe-&gt;apply(binary, binary);\n        cv::threshold(binary, binary, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);\n\n        std::vector&lt;std::vector&lt;cv::Point&gt;&gt; contours;\n        cv::findContours(binary, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);\n\n        if (contours.empty()) {\n            result.passed = false;\n            result.failureReason = \"No product detected\";\n            return false;\n        }\n\n        \/\/ \u6700\u5927\u306e\u8f2a\u90ed\u3092\u88fd\u54c1\u3068\u3057\u3066\u5224\u5b9a\n        auto productContour = *std::max_element(contours.begin(), contours.end(),\n            [](const auto&amp; c1, const auto&amp; c2) {\n                return cv::contourArea(c1) &lt; cv::contourArea(c2);\n            });\n\n        \/\/ \u56de\u8ee2\u3092\u8003\u616e\u3057\u305f\u5916\u63a5\u77e9\u5f62\u3092\u53d6\u5f97\n        cv::RotatedRect boundingBox = cv::minAreaRect(productContour);\n        float width = std::min(boundingBox.size.width, boundingBox.size.height);\n        float height = std::max(boundingBox.size.width, boundingBox.size.height);\n\n        const auto&amp; spec = getSpecification();\n        if (width &lt; spec.dimensions.minWidth || width &gt; spec.dimensions.maxWidth ||\n            height &lt; spec.dimensions.minHeight || height &gt; spec.dimensions.maxHeight) {\n\n            result.passed = false;\n            result.failureReason = \"Dimensions out of specification\";\n            return false;\n        }\n\n        return true;\n    }\n\n    bool checkColor(const cv::Mat&amp; image, InspectionResult&amp; result) {\n        cv::Mat hsv;\n        cv::cvtColor(image, hsv, cv::COLOR_BGR2HSV);\n\n        const auto&amp; spec = getSpecification();\n        bool colorMatched = false;\n\n        for (const auto&amp; colorSpec : spec.allowedColors) {\n            cv::Mat mask;\n            cv::Scalar lowerBound = colorSpec.targetColor - cv::Scalar(colorSpec.tolerance);\n            cv::Scalar upperBound = colorSpec.targetColor + cv::Scalar(colorSpec.tolerance);\n\n            cv::inRange(hsv, lowerBound, upperBound, mask);\n\n            \/\/ \u30e1\u30a4\u30f3\u30ab\u30e9\u30fc\u9818\u57df\u306e\u691c\u51fa\n            std::vector&lt;std::vector&lt;cv::Point&gt;&gt; contours;\n            cv::findContours(mask, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);\n\n            double totalArea = 0;\n            for (const auto&amp; contour : contours) {\n                totalArea += cv::contourArea(contour);\n            }\n\n            double colorRatio = totalArea \/ image.total();\n            if (colorRatio &gt; 0.8) {  \/\/ 80%\u4ee5\u4e0a\u304c\u8a31\u5bb9\u7bc4\u56f2\u5185\n                colorMatched = true;\n                break;\n            }\n        }\n\n        if (!colorMatched) {\n            result.passed = false;\n            result.failureReason = \"Color out of specification\";\n            return false;\n        }\n\n        return true;\n    }\n\n    bool detectDefects(const cv::Mat&amp; image, InspectionResult&amp; result) {\n        const auto&amp; spec = getSpecification();\n        cv::Mat grayImage, edges;\n        cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);\n\n        \/\/ \u30a8\u30c3\u30b8\u691c\u51fa\u306b\u3088\u308b\u6b20\u9665\u691c\u51fa\n        cv::Canny(grayImage, edges, 50, 150);\n\n        std::vector&lt;std::vector&lt;cv::Point&gt;&gt; defectContours;\n        cv::findContours(edges, defectContours, cv::RETR_LIST, cv::CHAIN_APPROX_SIMPLE);\n\n        std::vector&lt;cv::Point2f&gt; defectPoints;\n        for (const auto&amp; contour : defectContours) {\n            double area = cv::contourArea(contour);\n            if (area &gt; spec.quality.maxDefectSize) {\n                cv::Moments m = cv::moments(contour);\n                defectPoints.push_back(cv::Point2f(\n                    m.m10\/m.m00, m.m01\/m.m00));\n            }\n        }\n\n        \/\/ \u30c6\u30af\u30b9\u30c1\u30e3\u5206\u6790\u306b\u3088\u308b\u6b20\u9665\u691c\u51fa\n        cv::Mat gradient_x, gradient_y;\n        cv::Sobel(grayImage, gradient_x, CV_32F, 1, 0);\n        cv::Sobel(grayImage, gradient_y, CV_32F, 0, 1);\n        cv::Mat gradient_mag;\n        cv::magnitude(gradient_x, gradient_y, gradient_mag);\n\n        cv::Mat localVariance;\n        cv::boxFilter(gradient_mag.mul(gradient_mag), localVariance, -1,\n                     cv::Size(5, 5)) -\n        cv::boxFilter(gradient_mag, localVariance, -1,\n                     cv::Size(5, 5)).mul(cv::boxFilter(gradient_mag, localVariance,\n                                                      -1, cv::Size(5, 5)));\n\n        for (int y = 0; y &lt; localVariance.rows; y++) {\n            for (int x = 0; x &lt; localVariance.cols; x++) {\n                if (localVariance.at&lt;float&gt;(y, x) &gt; spec.quality.maxDefectSize) {\n                    defectPoints.push_back(cv::Point2f(x, y));\n                }\n            }\n        }\n\n        \/\/ \u7d50\u679c\u306e\u8a55\u4fa1\n        if (!defectPoints.empty()) {\n            result.defectLocations = defectPoints;\n            if (defectPoints.size() &gt; spec.quality.maxDefectCount) {\n                result.passed = false;\n                result.failureReason = \"Too many defects detected\";\n                return false;\n            }\n        }\n\n        return true;\n    }\n\n    bool verifyProductCode(const cv::Mat&amp; image, InspectionResult&amp; result) {\n        std::string decodedInfo;\n        std::vector&lt;cv::Point&gt; qrPoints;\n\n        if (!qrDetector-&gt;detect(image, qrPoints)) {\n            result.passed = false;\n            result.failureReason = \"Product code not detected or invalid\";\n            return false;\n        }\n\n        return true;\n    }\n\n    double calculateQualityScore(const cv::Mat&amp; image, \n                               const InspectionResult&amp; result) {\n        double score = 100.0;\n        const auto&amp; spec = getSpecification();\n\n        \/\/ \u6b20\u9665\u306b\u57fa\u3065\u304f\u30b9\u30b3\u30a2\u6e1b\u7b97\n        score -= (result.defectLocations.size() * \n                 (100.0 \/ spec.quality.maxDefectCount));\n\n        \/\/ \u30a8\u30c3\u30b8\u54c1\u8cea\u306e\u8a55\u4fa1\n        cv::Mat edges;\n        cv::Canny(image, edges, 100, 200);\n        double edgeQuality = cv::mean(edges)[0] \/ 255.0;\n        score *= (0.8 + 0.2 * edgeQuality);\n\n        \/\/ \u30c6\u30af\u30b9\u30c1\u30e3\u54c1\u8cea\u306e\u8a55\u4fa1\n        cv::Mat gray;\n        cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);\n        cv::Mat glcm = calculateGLCM(gray);\n        double textureScore = evaluateTexture(glcm);\n        score *= textureScore;\n\n        return std::max(0.0, std::min(100.0, score));\n    }\n\n    cv::Mat calculateGLCM(const cv::Mat&amp; gray) {\n        cv::Mat glcm = cv::Mat::zeros(256, 256, CV_32F);\n        for (int i = 0; i &lt; gray.rows; i++) {\n            for (int j = 0; j &lt; gray.cols - 1; j++) {\n                int intensity1 = gray.at&lt;uchar&gt;(i, j);\n                int intensity2 = gray.at&lt;uchar&gt;(i, j + 1);\n                glcm.at&lt;float&gt;(intensity1, intensity2)++;\n            }\n        }\n        cv::normalize(glcm, glcm, 0, 1, cv::NORM_MINMAX);\n        return glcm;\n    }\n\n    double evaluateTexture(const cv::Mat&amp; glcm) {\n        double contrast = 0, correlation = 0, energy = 0, homogeneity = 0;\n        double mean_i = 0, mean_j = 0, std_i = 0, std_j = 0;\n\n        \/\/ GLCM\u306e\u7279\u5fb4\u91cf\u8a08\u7b97\n        for (int i = 0; i &lt; glcm.rows; i++) {\n            for (int j = 0; j &lt; glcm.cols; j++) {\n                double p_ij = glcm.at&lt;float&gt;(i, j);\n                contrast += p_ij * (i - j) * (i - j);\n                energy += p_ij * p_ij;\n                homogeneity += p_ij \/ (1 + std::abs(i - j));\n                mean_i += i * p_ij;\n                mean_j += j * p_ij;\n            }\n        }\n\n        \/\/ \u30c6\u30af\u30b9\u30c1\u30e3\u30b9\u30b3\u30a2\u306e\u8a08\u7b97\n        double textureScore = (energy + homogeneity) \/ 2.0;\n        return 0.7 + 0.3 * textureScore;  \/\/ 0.7-1.0\u306e\u7bc4\u56f2\u306b\u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\n    }\n};<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-45\">\u5b9f\u88c5\u3055\u308c\u305f\u691c\u67fb\u6a5f\u80fd\u306e\u7279\u5fb4\uff1a<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u9ad8\u5ea6\u306a\u753b\u50cf\u89e3\u6790<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30de\u30eb\u30c1\u30b9\u30b1\u30fc\u30eb\u691c\u67fb<\/li>\n\n\n\n<li>\u30c6\u30af\u30b9\u30c1\u30e3\u5206\u6790<\/li>\n\n\n\n<li>\u6b20\u9665\u691c\u51fa\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u54c1\u8cea\u8a55\u4fa1\u30b7\u30b9\u30c6\u30e0<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8907\u6570\u306e\u8a55\u4fa1\u57fa\u6e96<\/li>\n\n\n\n<li>\u5b9a\u91cf\u7684\u306a\u30b9\u30b3\u30a2\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u8a73\u7d30\u306a\u6b20\u9665\u30de\u30c3\u30d4\u30f3\u30b0<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5805\u7262\u6027\u306e\u78ba\u4fdd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ce\u30a4\u30ba\u306b\u5bfe\u3059\u308b\u8010\u6027<\/li>\n\n\n\n<li>\u7167\u660e\u6761\u4ef6\u306e\u5909\u52d5\u5bfe\u5fdc<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6027\u80fd\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u52b9\u7387\u7684\u306a\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0<\/li>\n\n\n\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u306e\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u4e26\u5217\u51e6\u7406\u306e\u6e96\u5099<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-46\">Part 3: \u8996\u899a\u5316\u3068\u5b9f\u88c5\u4f8b<\/h4>\n\n\n\n<p>\u691c\u67fb\u30b7\u30b9\u30c6\u30e0\u306e\u8996\u899a\u5316\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u3068\u5b9f\u969b\u306e\u4f7f\u7528\u4f8b\u3092\u5b9f\u88c5\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ \u8996\u899a\u5316\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\nclass InspectionVisualizer {\nprivate:\n    const cv::Scalar COLOR_PASS = cv::Scalar(0, 255, 0);    \/\/ \u7dd1\n    const cv::Scalar COLOR_FAIL = cv::Scalar(0, 0, 255);    \/\/ \u8d64\n    const cv::Scalar COLOR_INFO = cv::Scalar(255, 255, 255); \/\/ \u767d\n    const int PADDING = 10;\n    const int FONT_SIZE = 0.7;\n\npublic:\n    cv::Mat createResultOverlay(const cv::Mat&amp; image,\n                              const InspectionResult&amp; result) {\n        cv::Mat overlay = image.clone();\n\n        \/\/ \u7d50\u679c\u30b9\u30c6\u30fc\u30bf\u30b9\u306e\u8868\u793a\n        drawStatus(overlay, result);\n\n        \/\/ \u54c1\u8cea\u30b9\u30b3\u30a2\u306e\u8868\u793a\n        drawQualityScore(overlay, result);\n\n        \/\/ \u6b20\u9665\u4f4d\u7f6e\u306e\u30de\u30fc\u30ad\u30f3\u30b0\n        drawDefectMarkers(overlay, result);\n\n        \/\/ \u60c5\u5831\u30d1\u30cd\u30eb\u306e\u8ffd\u52a0\n        drawInfoPanel(overlay, result);\n\n        return overlay;\n    }\n\nprivate:\n    void drawStatus(cv::Mat&amp; image, const InspectionResult&amp; result) {\n        std::string status = result.passed ? \"PASS\" : \"FAIL\";\n        cv::putText(image, status,\n                   cv::Point(PADDING, 30),\n                   cv::FONT_HERSHEY_SIMPLEX, FONT_SIZE * 1.5,\n                   result.passed ? COLOR_PASS : COLOR_FAIL,\n                   2);\n    }\n\n    void drawQualityScore(cv::Mat&amp; image, const InspectionResult&amp; result) {\n        std::stringstream ss;\n        ss &lt;&lt; std::fixed &lt;&lt; std::setprecision(1) \n           &lt;&lt; \"Quality Score: \" &lt;&lt; result.qualityScore &lt;&lt; \"%\";\n\n        cv::putText(image, ss.str(),\n                   cv::Point(PADDING, 60),\n                   cv::FONT_HERSHEY_SIMPLEX, FONT_SIZE,\n                   COLOR_INFO,\n                   1);\n    }\n\n    void drawDefectMarkers(cv::Mat&amp; image, const InspectionResult&amp; result) {\n        for (size_t i = 0; i &lt; result.defectLocations.size(); ++i) {\n            const auto&amp; defect = result.defectLocations[i];\n\n            \/\/ \u6b20\u9665\u4f4d\u7f6e\u306b\u5186\u3092\u63cf\u753b\n            cv::circle(image, defect, 5, COLOR_FAIL, -1);\n            cv::circle(image, defect, 7, COLOR_FAIL, 1);\n\n            \/\/ \u6b20\u9665\u756a\u53f7\u306e\u8868\u793a\n            cv::putText(image, \n                       \"D\" + std::to_string(i + 1),\n                       cv::Point(defect.x + 10, defect.y),\n                       cv::FONT_HERSHEY_SIMPLEX, FONT_SIZE * 0.8,\n                       COLOR_FAIL,\n                       1);\n        }\n    }\n\n    void drawInfoPanel(cv::Mat&amp; image, const InspectionResult&amp; result) {\n        const int PANEL_WIDTH = 300;\n        const int PANEL_HEIGHT = 150;\n        cv::Rect panelRect(image.cols - PANEL_WIDTH - PADDING, \n                          PADDING, \n                          PANEL_WIDTH, \n                          PANEL_HEIGHT);\n\n        \/\/ \u534a\u900f\u660e\u306e\u80cc\u666f\u30d1\u30cd\u30eb\n        cv::Mat panel = image(panelRect);\n        cv::Mat overlay = panel.clone();\n        overlay = cv::Scalar(0, 0, 0);\n        cv::addWeighted(overlay, 0.7, panel, 0.3, 0, panel);\n\n        \/\/ \u8a73\u7d30\u60c5\u5831\u306e\u8868\u793a\n        int y = panelRect.y + 25;\n        cv::putText(image, \"Inspection Details:\",\n                   cv::Point(panelRect.x + PADDING, y),\n                   cv::FONT_HERSHEY_SIMPLEX, FONT_SIZE,\n                   COLOR_INFO,\n                   1);\n\n        y += 25;\n        cv::putText(image, \"Defects: \" + \n                          std::to_string(result.defectLocations.size()),\n                   cv::Point(panelRect.x + PADDING, y),\n                   cv::FONT_HERSHEY_SIMPLEX, FONT_SIZE,\n                   COLOR_INFO,\n                   1);\n\n        if (!result.passed) {\n            y += 25;\n            std::string reason = result.failureReason;\n            size_t pos = 0;\n            while ((pos = reason.find(' ', 30)) != std::string::npos) {\n                cv::putText(image, reason.substr(0, pos),\n                           cv::Point(panelRect.x + PADDING, y),\n                           cv::FONT_HERSHEY_SIMPLEX, FONT_SIZE * 0.8,\n                           COLOR_FAIL,\n                           1);\n                reason = reason.substr(pos + 1);\n                y += 20;\n            }\n            cv::putText(image, reason,\n                       cv::Point(panelRect.x + PADDING, y),\n                       cv::FONT_HERSHEY_SIMPLEX, FONT_SIZE * 0.8,\n                       COLOR_FAIL,\n                       1);\n        }\n\n        \/\/ \u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u306e\u8868\u793a\n        auto time = std::chrono::system_clock::to_time_t(result.timestamp);\n        std::stringstream ss;\n        ss &lt;&lt; std::put_time(std::localtime(&amp;time), \"%Y-%m-%d %H:%M:%S\");\n\n        cv::putText(image, ss.str(),\n                   cv::Point(panelRect.x + PADDING, \n                            panelRect.y + PANEL_HEIGHT - PADDING),\n                   cv::FONT_HERSHEY_SIMPLEX, FONT_SIZE * 0.7,\n                   COLOR_INFO,\n                   1);\n    }\n};\n\n\/\/ \u4f7f\u7528\u4f8b\u3068\u5b9f\u88c5\u65b9\u6cd5\nint main() {\n    try {\n        \/\/ \u88fd\u54c1\u4ed5\u69d8\u306e\u8a2d\u5b9a\n        ProductSpecification spec;\n        spec.dimensions = {\n            100.0, \/\/ minWidth\n            150.0, \/\/ maxWidth\n            100.0, \/\/ minHeight\n            150.0  \/\/ maxHeight\n        };\n\n        spec.allowedColors = {\n            {cv::Scalar(0, 100, 100), 10.0},    \/\/ \u8d64\u7cfb\n            {cv::Scalar(120, 100, 100), 10.0}   \/\/ \u9752\u7cfb\n        };\n\n        spec.quality = {\n            0.95,  \/\/ minSurfaceQuality\n            50.0,  \/\/ maxDefectSize\n            5      \/\/ maxDefectCount\n        };\n\n        \/\/ \u57fa\u6e96\u753b\u50cf\u306e\u8aad\u307f\u8fbc\u307f\n        spec.referenceImage = cv::imread(\"reference_product.jpg\");\n        if (spec.referenceImage.empty()) {\n            throw std::runtime_error(\"Failed to load reference image\");\n        }\n\n        \/\/ \u691c\u67fb\u30b7\u30b9\u30c6\u30e0\u306e\u521d\u671f\u5316\n        InspectionProcessor inspector(spec);\n        InspectionVisualizer visualizer;\n\n        \/\/ \u30ab\u30e1\u30e9\u307e\u305f\u306f\u753b\u50cf\u30b7\u30fc\u30b1\u30f3\u30b9\u304b\u3089\u306e\u5165\u529b\n        cv::VideoCapture cap(0);\n        if (!cap.isOpened()) {\n            throw std::runtime_error(\"Failed to open camera\");\n        }\n\n        cv::Mat frame;\n        bool isRunning = true;\n\n        while (isRunning) {\n            \/\/ \u30d5\u30ec\u30fc\u30e0\u306e\u53d6\u5f97\n            cap &gt;&gt; frame;\n            if (frame.empty()) break;\n\n            \/\/ \u88fd\u54c1\u691c\u67fb\u306e\u5b9f\u884c\n            auto result = inspector.inspectProduct(frame);\n\n            \/\/ \u691c\u67fb\u7d50\u679c\u306e\u8996\u899a\u5316\n            auto display = visualizer.createResultOverlay(frame, result);\n            cv::imshow(\"Product Inspection\", display);\n\n            \/\/ \u30ad\u30fc\u5165\u529b\u306e\u51e6\u7406\n            char key = cv::waitKey(1);\n            switch (key) {\n                case 'q':\n                    isRunning = false;\n                    break;\n                case 's':\n                    \/\/ \u7d50\u679c\u306e\u4fdd\u5b58\n                    {\n                        auto time = std::chrono::system_clock::now();\n                        auto time_t = std::chrono::system_clock::to_time_t(time);\n                        std::stringstream ss;\n                        ss &lt;&lt; \"inspection_\" \n                           &lt;&lt; std::put_time(std::localtime(&amp;time_t), \n                                          \"%Y%m%d_%H%M%S\") \n                           &lt;&lt; \".jpg\";\n                        cv::imwrite(ss.str(), display);\n                    }\n                    break;\n                case 'r':\n                    \/\/ \u57fa\u6e96\u753b\u50cf\u306e\u66f4\u65b0\n                    spec.referenceImage = frame.clone();\n                    break;\n            }\n        }\n\n        return 0;\n\n    } catch (const std::exception&amp; e) {\n        std::cerr &lt;&lt; \"Error: \" &lt;&lt; e.what() &lt;&lt; std::endl;\n        return -1;\n    }\n}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"i-47\">\u5b9f\u88c5\u306e\u7279\u5fb4\uff1a<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u306a\u8996\u899a\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u306e\u7d50\u679c\u8868\u793a<\/li>\n\n\n\n<li>\u76f4\u611f\u7684\u306a\u30e6\u30fc\u30b6\u30fc\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u53ef\u80fd\u306a\u8868\u793a<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u64cd\u4f5c\u6027\u306e\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30ad\u30fc\u30dc\u30fc\u30c9\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8<\/li>\n\n\n\n<li>\u7d50\u679c\u306e\u4fdd\u5b58\u6a5f\u80fd<\/li>\n\n\n\n<li>\u57fa\u6e96\u753b\u50cf\u306e\u66f4\u65b0\u6a5f\u80fd<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b9f\u7528\u7684\u306a\u6a5f\u80fd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7\u4ed8\u304d\u306e\u7d50\u679c\u4fdd\u5b58<\/li>\n\n\n\n<li>\u8a73\u7d30\u306a\u60c5\u5831\u8868\u793a<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u51e6\u7406\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u62e1\u5f35\u6027\u306e\u78ba\u4fdd<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e2\u30b8\u30e5\u30fc\u30eb\u5316\u3055\u308c\u305f\u8a2d\u8a08<\/li>\n\n\n\n<li>\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u53ef\u80fd\u306a\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8<\/li>\n\n\n\n<li>\u4fdd\u5b88\u6027\u306e\u9ad8\u3044\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"i-48\">\u307e\u3068\u3081\u3068\u4eca\u5f8c\u306e\u5c55\u671b<\/h2>\n\n\n\n<p>\u672c\u8a18\u4e8b\u3067\u306f\u3001C++\u3068OpenCV\u3092\u4f7f\u7528\u3057\u305f\u753b\u50cf\u51e6\u7406\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a\u306b\u3064\u3044\u3066\u3001\u57fa\u790e\u304b\u3089\u5b9f\u8df5\u7684\u306a\u5b9f\u88c5\u307e\u3067\u5e45\u5e83\u304f\u89e3\u8aac\u3057\u3066\u304d\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-49\">\u4e3b\u8981\u306a\u5b9f\u88c5\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u57fa\u790e\u77e5\u8b58\u3068\u74b0\u5883\u69cb\u7bc9<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OpenCV\u306e\u7279\u5fb4\u3068\u5229\u70b9\u306e\u7406\u89e3<\/li>\n\n\n\n<li>\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u958b\u767a\u74b0\u5883\u306e\u69cb\u7bc9<\/li>\n\n\n\n<li>\u52b9\u7387\u7684\u306a\u958b\u767a\u30ef\u30fc\u30af\u30d5\u30ed\u30fc\u306e\u78ba\u7acb<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u753b\u50cf\u51e6\u7406\u306e\u57fa\u672c\u64cd\u4f5c<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u753b\u50cf\u306e\u8aad\u307f\u8fbc\u307f\u3068\u8868\u793a<\/li>\n\n\n\n<li>\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u3068\u524d\u51e6\u7406<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b9f\u8df5\u7684\u306a\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u5b9f\u88c5<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u9854\u691c\u51fa\u30b7\u30b9\u30c6\u30e0\u306e\u69cb\u7bc9<\/li>\n\n\n\n<li>\u7269\u4f53\u8ffd\u8de1\u6a5f\u80fd\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u9ad8\u5ea6\u306a\u753b\u50cf\u8a8d\u8b58\u6a5f\u80fd\u306e\u7d71\u5408<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u6700\u9069\u5316<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u7ba1\u7406\u306e\u52b9\u7387\u5316<\/li>\n\n\n\n<li>\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u51e6\u7406\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u51e6\u7406\u901f\u5ea6\u306e\u6539\u5584\u624b\u6cd5<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u5b9f\u7528\u7684\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u30b7\u30b9\u30c6\u30e0\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u54c1\u8cea\u7ba1\u7406\u30b7\u30b9\u30c6\u30e0\u306e\u69cb\u7bc9<\/li>\n\n\n\n<li>\u5b9f\u904b\u7528\u3092\u8003\u616e\u3057\u305f\u8a2d\u8a08<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-50\">\u958b\u767a\u4e0a\u306e\u91cd\u8981\u306a\u30dd\u30a4\u30f3\u30c8<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30b3\u30fc\u30c9\u54c1\u8cea\u306e\u78ba\u4fdd<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u30a8\u30e9\u30fc\u30cf\u30f3\u30c9\u30ea\u30f3\u30b0\u306e\u4f8b\n   try {\n       \/\/ \u91cd\u8981\u306a\u51e6\u7406\n       processImage();\n   } catch (const cv::Exception&amp; e) {\n       \/\/ OpenCV\u7279\u6709\u306e\u30a8\u30e9\u30fc\u51e6\u7406\n       logError(\"OpenCV error: \" + std::string(e.what()));\n   } catch (const std::exception&amp; e) {\n       \/\/ \u6a19\u6e96\u7684\u306a\u30a8\u30e9\u30fc\u51e6\u7406\n       logError(\"Standard error: \" + std::string(e.what()));\n   }<\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u4fdd\u5b88\u6027\u306e\u5411\u4e0a<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u30b3\u30f3\u30d5\u30a3\u30ae\u30e5\u30ec\u30fc\u30b7\u30e7\u30f3\u7ba1\u7406\u306e\u4f8b\n   class Configuration {\n   public:\n       static void load(const std::string&amp; path) {\n           \/\/ \u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f\n       }\n       static void save(const std::string&amp; path) {\n           \/\/ \u8a2d\u5b9a\u306e\u4fdd\u5b58\n       }\n       static void validate() {\n           \/\/ \u8a2d\u5b9a\u5024\u306e\u691c\u8a3c\n       }\n   };<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>\u62e1\u5f35\u6027\u306e\u78ba\u4fdd<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">   \/\/ \u30d7\u30e9\u30b0\u30a4\u30f3\u6a5f\u69cb\u306e\u4f8b\n   class ImageProcessor {\n   public:\n       virtual void process(cv::Mat&amp; image) = 0;\n       virtual ~ImageProcessor() = default;\n   };\n\n   \/\/ \u65b0\u3057\u3044\u51e6\u7406\u306e\u8ffd\u52a0\u304c\u5bb9\u6613\n   class CustomProcessor : public ImageProcessor {\n   public:\n       void process(cv::Mat&amp; image) override {\n           \/\/ \u30ab\u30b9\u30bf\u30e0\u51e6\u7406\u306e\u5b9f\u88c5\n       }\n   };<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-51\">\u4eca\u5f8c\u306e\u5c55\u671b<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6280\u8853\u7684\u306a\u767a\u5c55<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30c7\u30a3\u30fc\u30d7\u30e9\u30fc\u30cb\u30f3\u30b0\u30e2\u30c7\u30eb\u306e\u7d71\u5408<\/li>\n\n\n\n<li>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u51e6\u7406\u306e\u66f4\u306a\u308b\u6700\u9069\u5316<\/li>\n\n\n\n<li>\u30a8\u30c3\u30b8\u30c7\u30d0\u30a4\u30b9\u3067\u306e\u5c55\u958b<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u62e1\u5f35<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30af\u30e9\u30a6\u30c9\u3068\u306e\u9023\u643a\u6a5f\u80fd<\/li>\n\n\n\n<li>\u30e2\u30d0\u30a4\u30eb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u767a<\/li>\n\n\n\n<li>IoT\u30c7\u30d0\u30a4\u30b9\u3068\u306e\u7d71\u5408<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6700\u9069\u5316\u306e\u65b9\u5411\u6027<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GPU\u30a2\u30af\u30bb\u30e9\u30ec\u30fc\u30b7\u30e7\u30f3\u306e\u6d3b\u7528<\/li>\n\n\n\n<li>\u5206\u6563\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u306e\u69cb\u7bc9<\/li>\n\n\n\n<li>\u30a8\u30c3\u30b8\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u5b9f\u88c5<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-52\">\u5b9f\u88c5\u6642\u306e\u6ce8\u610f\u70b9<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u6027\u80fd\u8003\u616e<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u76e3\u8996<\/li>\n\n\n\n<li>\u51e6\u7406\u901f\u5ea6\u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30ea\u30f3\u30b0<\/li>\n\n\n\n<li>\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406\u306e\u6700\u9069\u5316<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u54c1\u8cea\u7ba1\u7406<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30e6\u30cb\u30c3\u30c8\u30c6\u30b9\u30c8\u306e\u5b9f\u88c5<\/li>\n\n\n\n<li>\u7d99\u7d9a\u7684\u30a4\u30f3\u30c6\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3<\/li>\n\n\n\n<li>\u30b3\u30fc\u30c9\u30ec\u30d3\u30e5\u30fc\u306e\u5b9f\u65bd<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u5bfe\u7b56<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5165\u529b\u30c7\u30fc\u30bf\u306e\u691c\u8a3c<\/li>\n\n\n\n<li>\u30a8\u30e9\u30fc\u60c5\u5831\u306e\u9069\u5207\u306a\u51e6\u7406<\/li>\n\n\n\n<li>\u30bb\u30ad\u30e5\u30a2\u306a\u30ea\u30bd\u30fc\u30b9\u7ba1\u7406<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"i-53\">\u5229\u7528\u30b7\u30fc\u30f3\u5225\u306e\u63a8\u5968\u69cb\u6210<\/h3>\n\n\n<div id=\"id-0120abb0-9715-47dd-a4c4-a69456c0141b\">\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u7528\u9014<\/th><th>\u63a8\u5968\u8a2d\u5b9a<\/th><th>\u6ce8\u610f\u70b9<\/th><\/tr><\/thead><tbody><tr><td>\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u51e6\u7406<\/td><td>\u30de\u30eb\u30c1\u30b9\u30ec\u30c3\u30c9\u69cb\u6210<\/td><td>\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u306e\u7ba1\u7406<\/td><\/tr><tr><td>\u30d0\u30c3\u30c1\u51e6\u7406<\/td><td>\u5927\u898f\u6a21\u30c7\u30fc\u30bf\u51e6\u7406<\/td><td>\u30c7\u30a3\u30b9\u30afI\/O\u306e\u6700\u9069\u5316<\/td><\/tr><tr><td>\u7d44\u307f\u8fbc\u307f\u6a5f\u5668<\/td><td>\u30ea\u30bd\u30fc\u30b9\u6700\u9069\u5316<\/td><td>\u7701\u30e1\u30e2\u30ea\u8a2d\u8a08<\/td><\/tr><tr><td>\u30af\u30e9\u30a6\u30c9\u9023\u643a<\/td><td>\u5206\u6563\u51e6\u7406\u5bfe\u5fdc<\/td><td>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u9045\u5ef6\u8003\u616e<\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"i-54\">\u304a\u308f\u308a\u306b<\/h3>\n\n\n\n<p>C++\u3068OpenCV\u3092\u7d44\u307f\u5408\u308f\u305b\u305f\u753b\u50cf\u51e6\u7406\u30b7\u30b9\u30c6\u30e0\u306e\u958b\u767a\u3067\u306f\u3001\u57fa\u790e\u7684\u306a\u77e5\u8b58\u304b\u3089\u5b9f\u8df5\u7684\u306a\u30c6\u30af\u30cb\u30c3\u30af\u307e\u3067\u3001\u5e45\u5e83\u3044\u7406\u89e3\u304c\u5fc5\u8981\u3067\u3059\u3002\u672c\u8a18\u4e8b\u3067\u89e3\u8aac\u3057\u305f\u5185\u5bb9\u3092\u57fa\u306b\u3001\u305d\u308c\u305e\u308c\u306e\u8981\u4ef6\u306b\u5408\u308f\u305b\u305f\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3092\u884c\u3044\u3001\u52b9\u7387\u7684\u306a\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u958b\u767a\u3092\u9032\u3081\u3066\u3044\u305f\u3060\u3051\u308c\u3070\u5e78\u3044\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u307e\u305f\u3001\u6280\u8853\u306e\u9032\u5316\u306f\u65e5\u3005\u7d9a\u3044\u3066\u3044\u308b\u305f\u3081\u3001\u5e38\u306b\u65b0\u3057\u3044\u624b\u6cd5\u3084\u30c4\u30fc\u30eb\u3092\u30ad\u30e3\u30c3\u30c1\u30a2\u30c3\u30d7\u3057\u3001\u30b7\u30b9\u30c6\u30e0\u306e\u6539\u5584\u3092\u7d99\u7d9a\u7684\u306b\u884c\u3046\u3053\u3068\u304c\u91cd\u8981\u3067\u3059\u3002OpenCV\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u3084\u95a2\u9023\u6280\u8853\u306e\u52d5\u5411\u3092\u6ce8\u8996\u3057\u306a\u304c\u3089\u3001\u3088\u308a\u826f\u3044\u30b7\u30b9\u30c6\u30e0\u3092\u76ee\u6307\u3057\u3066\u958b\u767a\u3092\u9032\u3081\u3066\u3044\u304f\u3053\u3068\u3092\u304a\u52e7\u3081\u3057\u307e\u3059\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Warning: Undefined array key &#8220;is_admin&#8221; in \/home\/xs392991\/dexall.co.jp\/public_html\/articles\/wp-content\/themes\/ &#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":{"0":"post-2181","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-cpp","7":"nothumb"},"_links":{"self":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2181"}],"version-history":[{"count":1,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2181\/revisions"}],"predecessor-version":[{"id":2182,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=\/wp\/v2\/posts\/2181\/revisions\/2182"}],"wp:attachment":[{"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dexall.co.jp\/articles\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}