العمل مع الصور: تغيير الحجم والقص بلغة C++ مع OpenCV
\n\nفي تطوير التطبيقات الحديثة، خاصة في مجالات الرؤية الحاسوبية، استخراج بيانات الويب، أو معالجة ملفات الوسائط، غالبًا ما تنشأ الحاجة إلى تغيير حجم (resize) وقص (crop) الصور برمجيًا. توفر لغة C++ مع مكتبة OpenCV القوية جميع الأدوات اللازمة لذلك. في هذه المقالة، سنشرح بالتفصيل كيفية تنفيذ هذه العمليات، وما هي المعاملات التي تؤثر على جودة النتيجة، وسنقدم أمثلة جاهزة للكود.
\n\nمكتبة OpenCV - المعيار الفعلي للعمل مع الصور بلغة C++
\n\nOpenCV (مكتبة الرؤية الحاسوبية مفتوحة المصدر) هي مكتبة متعددة المنصات ومفتوحة المصدر، تحتوي على مئات الخوارزميات المحسّنة لمعالجة الصور والفيديو. وهي مكتوبة بلغة C++ ولها روابط لـ Python و Java ولغات أخرى. بالنسبة لـ C++، تعتبر OpenCV الحل الأكثر أداءً ووظيفية.
\n\nالمزايا الرئيسية لـ OpenCV لمهام تغيير الحجم والقص:
\n- \n
- سرعة عالية - تستخدم جميع الدوال تعليمات SIMD وتعدد المهام. \n
- مرونة - دعم طرق استيفاء مختلفة (ثنائي الخط، ثنائي التكعيب، طريقة لانزوش وغيرها). \n
- سهولة الاستخدام - العمل مع الصور عبر الفئة
cv::Matالتي تدير الذاكرة تلقائيًا. \n
تثبيت OpenCV لـ C++
\nللبدء، يجب تثبيت المكتبة. الطريقة الأكثر شيوعًا هي عبر مدير الحزم vcpkg أو البناء من المصدر. مثال للتثبيت عبر vcpkg:
\ngit clone https://github.com/Microsoft/vcpkg.git\ncd vcpkg\n./bootstrap-vcpkg.sh\n./vcpkg install opencv4\n\nبعد التثبيت، قم بتوصيل المكتبة في ملف CMakeLists.txt الخاص بك:
\nfind_package(OpenCV REQUIRED)\ntarget_link_libraries(your_project ${OpenCV_LIBS})\n\nتغيير حجم الصورة (resize)
\nتتيح الدالة cv::resize() تغيير أبعاد الصورة الأصلية إلى العرض والارتفاع المطلوبين. الصيغة:
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
INTER_NEAREST- طريقة أقرب جار (سريعة ولكن جودة منخفضة). \n INTER_LINEAR- استيفاء ثنائي الخط (توازن جيد بين السرعة والجودة). \n INTER_CUBIC- استيفاء ثنائي التكعيب (جودة أعلى ولكن أبطأ). \n INTER_LANCZOS4- استيفاء لانزوش (أفضل جودة عند التكبير). \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().
صيغة القص