@Leffken
Студент, как студент!

Как грамотно работать с указателями в c++?

Работаю с библиотекой OpenCV 2 версии.
При помощи нее получаю указатель на изображение:
IplImage *frame; //я же правильно понимаю, это указатель?

От сюда я могу получать некие данные, обращаясь как к объекту, вроде:
int width = frame->width;
int height = frame->height;

Как правильнее работать с таким типом данных? Создаю довольно большой класс по работе с 1 кадром, который получаю с камеры. Много разных методов и временных "изображений" - объектов IplImage * (поправите если не правильно выразился)
Сейчас реализовано примерно так :
class opencv
{
private: IplImage *frame, *gray;

public: void getGray() {
this->gray = cvCreateImage(cvSize(this->frame->width, this->frame->height), this->frame->depth, 1);
cvConvertImage(this->frame, this->gray, CV_BGR2GRAY);
}
}

Т.е. я записываю в уже существующий указатель, но можно возвращать указатель из метода, вроде:
public: IplImage * getGray() {
IplImage *gray = cvCreateImage(cvSize(this->frame->width, this->frame->height), this->frame->depth, 1);
cvConvertImage(this->frame, gray, CV_BGR2GRAY);
return gray;
}

Но в таком случае появляется операция создания указателя!
Дак вот вопрос:
Как же работать правильнее с данным типом данных, вроде здравый смысл говорит что второй вариант "логичнее" и понятнее, особенно когда появляется 10-15 методов обработки 1 кадра. И каждый раз будет создание нового указателя. Долгая ли это операция ? Как понятно из контекста каждая мс дорога, именно поэтому и не работаю с типом Mat, этой же библиотеки т.к. скорость там оооочень храмает.
или же пойти по принципу самой библиотеки, передавать в метод 2 указателя: 1-ый входной, 2-ой выходной ?
  • Вопрос задан
  • 370 просмотров
Пригласить эксперта
Ответы на вопрос 1
@SolidMinus
Вопрос я честно говоря мало понял. поэтому отвечу как понял.

И каждый раз будет создание нового указателя


Создание указателя ничем не отличается от создания другой переменной. Это просто переменная в которой находится значение (4 байта на x86, 8 байт на x64) адреса какой-либо ячейки памяти. Если этот процесс сопровождается выделением памяти под что-либо, то процесс, безусловно, становится дольше. Но это не идет ни в какое сравнение со скоростью в других языках, например, интерпретируемых. Поэтому особого запара предполагать не должно.

Как же работать правильнее с данным типом данных, вроде здравый смысл говорит что второй вариант "логичнее" и понятнее, особенно когда появляется 10-15 методов обработки 1 кадра. И каждый раз будет создание нового указателя


Я не совсем понимаю в чем проблема. В выборе способа возврата значений из функции?

И через this-> и через return скорость одинаковая. Это линейные операторы со сложностью O(1) ( как и все присваивания ) и не должны волновать как либо.

И, я, честно говоря, совсем не понимаю, зачем браться за довольно сложный для новичка OpenCV если не понимаешь даже что такое указатель?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы