معالجة الصور بلغة C++: تغيير الحجم والقص باستخدام مكتبة OpenCV

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع الصور: تغيير الحجم والقص بلغة C++ مع OpenCV

\n\n

في تطوير التطبيقات الحديثة، خاصة في مجالات الرؤية الحاسوبية، استخراج بيانات الويب، أو معالجة ملفات الوسائط، غالبًا ما تنشأ الحاجة إلى تغيير حجم (resize) وقص (crop) الصور برمجيًا. توفر لغة C++ مع مكتبة OpenCV القوية جميع الأدوات اللازمة لذلك. في هذه المقالة، سنشرح بالتفصيل كيفية تنفيذ هذه العمليات، وما هي المعاملات التي تؤثر على جودة النتيجة، وسنقدم أمثلة جاهزة للكود.

\n\n

مكتبة OpenCV - المعيار الفعلي للعمل مع الصور بلغة C++

\n\n

OpenCV (مكتبة الرؤية الحاسوبية مفتوحة المصدر) هي مكتبة متعددة المنصات ومفتوحة المصدر، تحتوي على مئات الخوارزميات المحسّنة لمعالجة الصور والفيديو. وهي مكتوبة بلغة C++ ولها روابط لـ Python و Java ولغات أخرى. بالنسبة لـ C++، تعتبر OpenCV الحل الأكثر أداءً ووظيفية.

\n\n

المزايا الرئيسية لـ OpenCV لمهام تغيير الحجم والقص:

\n
    \n
  • سرعة عالية - تستخدم جميع الدوال تعليمات SIMD وتعدد المهام.
  • \n
  • مرونة - دعم طرق استيفاء مختلفة (ثنائي الخط، ثنائي التكعيب، طريقة لانزوش وغيرها).
  • \n
  • سهولة الاستخدام - العمل مع الصور عبر الفئة cv::Mat التي تدير الذاكرة تلقائيًا.
  • \n
\n\n

تثبيت OpenCV لـ C++

\n

للبدء، يجب تثبيت المكتبة. الطريقة الأكثر شيوعًا هي عبر مدير الحزم vcpkg أو البناء من المصدر. مثال للتثبيت عبر vcpkg:

\n
git clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n./bootstrap-vcpkg.sh\n./vcpkg install opencv4
\n\n

بعد التثبيت، قم بتوصيل المكتبة في ملف CMakeLists.txt الخاص بك:

\n
find_package(OpenCV REQUIRED)\ntarget_link_libraries(your_project ${OpenCV_LIBS})
\n\n

تغيير حجم الصورة (resize)

\n

تتيح الدالة cv::resize() تغيير أبعاد الصورة الأصلية إلى العرض والارتفاع المطلوبين. الصيغة:

\n
cv::resize(\n    InputArray src,      // الصورة الأصلية\n    OutputArray dst,     // الصورة الناتجة\n    Size dsize,          // الحجم الجديد (العرض، الارتفاع)\n    double fx = 0,       // مقياس X (إذا لم يتم تحديد dsize)\n    double fy = 0,       // مقياس Y\n    int interpolation = INTER_LINEAR  // طريقة الاستيفاء\n);
\n\n

يحدد المعامل interpolation الخوارزمية المستخدمة لحساب البكسلات الجديدة. الخيارات الرئيسية:

\n
    \n
  • INTER_NEAREST - طريقة أقرب جار (سريعة ولكن جودة منخفضة).
  • \n
  • INTER_LINEAR - استيفاء ثنائي الخط (توازن جيد بين السرعة والجودة).
  • \n
  • INTER_CUBIC - استيفاء ثنائي التكعيب (جودة أعلى ولكن أبطأ).
  • \n
  • INTER_LANCZOS4 - استيفاء لانزوش (أفضل جودة عند التكبير).
  • \n
\n\n

مثال لتكبير الصورة مرتين باستخدام استيفاء ثنائي التكعيب:

\n
#include <opencv2/opencv.hpp>\n#include <iostream>\n\nint main() {\n    cv::Mat src = cv::imread("input.jpg");\n    if (src.empty()) {\n        std::cerr << "فشل تحميل الصورة" << std::endl;\n        return -1;\n    }\n\n    cv::Mat dst;\n    cv::resize(src, dst, cv::Size(), 2.0, 2.0, cv::INTER_CUBIC);\n\n    cv::imwrite("output_resized.jpg", dst);\n    std::cout << "تم تكبير الصورة وحفظها" << std::endl;\n    return 0;\n}
\n\n

قص الصورة (crop)

\n

لا توجد دالة منفصلة للقص في OpenCV. بدلاً من ذلك، يتم استخدام آلية منطقة الاهتمام (ROI) - تحديد منطقة مستطيلة في الصورة. يتم ذلك باستخدام عامل التشغيل () أو طريقة cv::Mat::operator().

\n\n

صيغة القص

توصيات