العمل مع الصور: تغيير الحجم والقص باستخدام C++
في الرسوميات الحاسوبية الحديثة ورؤية الكمبيوتر، تعتبر عمليات تغيير الحجم (resize) والقص (crop) للصور أساسية. سواء كنت تطور تطبيقًا لمعالجة الصور الفوتوغرافية، أو نظامًا للتعرف على الوجوه، أو ترغب ببساطة في تجهيز الصور لشبكة عصبية — لا يمكن الاستغناء عن هذه الوظائف. في هذه المقالة، سنشرح بالتفصيل كيفية تنفيذ عمليات resize وcrop بلغة C++ باستخدام المكتبة القوية OpenCV.
لماذا OpenCV؟
OpenCV (مكتبة رؤية الكمبيوتر مفتوحة المصدر) هي المعيار الفعلي لمهام رؤية الكمبيوتر. إنها مكتوبة بلغة C/C++ وتوفر مئات الخوارزميات المحسّنة. للعمل مع عمليات resize وcrop، سنحتاج فقط إلى بضع دوال، لكن أداءها ومرونتها يجعلان OpenCV الخيار الأمثل.
يمكن تثبيت OpenCV عبر مدير الحزم (مثل vcpkg install opencv أو brew install opencv)، أو عن طريق البناء من المصدر. تفاصيل التثبيت خارج نطاق هذه المقالة، لكن من المفترض أن يكون لديك مشروع مهيأ مع المكتبة الموصولة.
التحضير: تحميل الصورة
قبل تغيير أي شيء، يجب تحميل الصورة. في OpenCV، يتم ذلك باستخدام الدالة imread():
#include <opencv2/opencv.hpp>#include <iostream>
using namespace cv;using namespace std;
int main() { // تحميل الصورة Mat image = imread("input.jpg"); if (image.empty()) { cerr << "خطأ في تحميل الصورة!" << endl; return -1; } cout << "حجم الصورة الأصلية: " << image.cols << " x " << image.rows << endl; return 0;}ترجع الدالة كائنًا من النوع Mat (مصفوفة). إذا لم يتم العثور على الملف أو كان تالفًا، سترجع image.empty() القيمة true.
تغيير حجم الصورة (resize) في C++
تتيح الدالة resize() في OpenCV تغيير مقياس الصورة إلى أبعاد عشوائية. وهي تدعم عدة طرق للاستيفاء تؤثر على جودة النتيجة.
صيغة الدالة resize
void resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR);- src — الصورة الأصلية.
- dst — الصورة الناتجة.
- dsize — الحجم الجديد (العرض، الارتفاع). يمكن تحديده صراحةً أو حسابه عبر
fxوfy. - fx — معامل المقياس للعرض (إذا كان dsize = Size()).
- fy — معامل المقياس للارتفاع.
- interpolation — طريقة الاستيفاء. الخيارات الرئيسية:
INTER_NEAREST— أقرب جار (سريع ولكن مع تشوهات).INTER_LINEAR— ثنائي الخطي (افتراضي، توازن جيد).INTER_CUBIC— تكعيبي (أبطأ ولكن بجودة أعلى).INTER_AREA— يُستخدم عند تصغير الصورة (منطقة البكسل).
مثال 1: التصغير إلى حجم ثابت
Mat resized;Size newSize(300, 200); // العرض 300، الارتفاع 200resize(image, resized, newSize, 0, 0, INTER_AREA);imwrite("resized_fixed.jpg", resized);cout << "الحجم بعد resize: " << resized.cols << " x " << resized.rows << endl;مثال 2: القياس بمقدار النصف مع الحفاظ على النسب
Mat scaled;resize(image, scaled, Size(), 0.5, 0.5, INTER_LINEAR);imwrite("scaled_half.jpg", scaled);إذا تم تحديد dsize = Size()، فسيتم حساب الأبعاد الجديدة وفقًا للصيغ: dsiz