get pixel and set pixel opencv - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

get pixel and set pixel opencv

+2 امتیاز
سلام  میشه بگین چه طوری میشه مفادیر RGB پیکسل های یه تصویر رو خوند یا مقدار دهی کرد؟

ممنون
سوال شده شهریور 11, 1393  بوسیله ی محدثه (امتیاز 121)   9 28 42
دوباره تگ گذاری شد شهریور 11, 1393
برای خواندن یا ست کردن بصورت راندم میشه از at استفاده کرد این لینک رو ببینید : http://goo.gl/7gfWAV

2 پاسخ

+3 امتیاز
سلام دوست عزیز!
من از این کد استفاده می کنم... در شرایط مختلف راه های بهتری/بهینه‌تری هست:
void set_r (Mat* source_image, int x, int y, unsigned char c)

{
	source_image->data [source_image->step * y + 3*x + 2] = c;
}

void set_g (Mat* source_image, int x, int y, unsigned char c)
{
	source_image->data [source_image->step * y + 3*x + 1] = c;
}

void set_b (Mat* source_image, int x, int y, unsigned char c)
{
	source_image->data [source_image->step * y + 3*x + 0] = c;
}


unsigned char get_r (Mat* source_image, int x, int y)
{
	return source_image->data [source_image->step * y + 3*x + 2];
}

unsigned char get_g (Mat* source_image, int x, int y)
{
	return source_image->data [source_image->step * y + 3*x + 1];
}

unsigned char get_b (Mat* source_image, int x, int y)
{
	return source_image->data [source_image->step * y + 3*x + 0];

امیدوارم با پارامتری که از نوع Mat هست مشکلی نداشته باشی...

مثلا این خط رو ببین، برای باز کردن:

Mat img = imread (image_file_name, 1);

و مثلا برای ذخیره کردن همین تصویر باز شده:

imwrite (image_file_name, img);

ولی قبل از همه!...:

#include <opencv2/opencv.hpp>

using namespace cv;

 

پاسخ داده شده شهریور 11, 1393 بوسیله ی مسعود لپه‌چی (امتیاز 928)   12 31 50
ویرایش شده شهریور 11, 1393 بوسیله ی مسعود لپه‌چی
ممنون لطف کردید ولی این unsigned char چی متغیریه؟
]چرا int نمیزارین ؟
وراه های دیگه چی هست
unsigned char گذاشتم چون یه بایت داریم (char) که مقادیری که می پذیره هم نمی خوایم منفی باشه(unsigned)... مقادیری که می پذیره از ۰ تا ۲۵۵ می تونه باشه...
منظورم از کد بهینه تر اینه که شما تو این کد به دلیل این که به دفعات زیاد توابع رو صدا می زنی ممکنه در یه حلقه ی تو در تو که برای خوندن مقادیر پیکسل ها داری سرعت کارت پایین تر بیاد...
می تونی بدون استفاده از اون توابع سریعا وسط کدت به مقدار دلخواهت دسترسی پیدا کنی... اما خوب من این طوری نوشتم که معلوم باشه چی به چیه...
برنامه نویس حرفه ای ++C نیستم! شاید بعضی ها راه های بهتری به نظرشون برسه...
+3 امتیاز
اگر نیاز به دسترسی ترتیبی دارید از تابع ptr از کلاس Mat استفاده کنید که به صورت generic هستش این تابع type و شماره سطر را از شما گرفته و آدرس سطر مورد نظر را در تصویر بر می گردونه. که در اینجا توضیح داده شده.
برای حالت دسترسی تصادفی هم می تونید از تابع at استفاده کنید که مختصات نقطه مورد نظر را از شما دریافت کرده و مقدار cv::Scalar بر می گردونه که آن هم در اینجا توضیح داده شده.
 
پاسخ داده شده شهریور 11, 1393 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
ممنون ولی تو این لینکا برای ست کردنه برای گت کردن چی؟
داخل همین لینک دوم پاسخ دوم رو ببینید برای get کردن هست :
auto& temp=image.at<cv::Vec3b>(curRow,curCol);
std::cout<< (int)temp[0]<<" "<<(int)temp[1]<<"  "<<(int)temp[2]<<std::endl;
...