Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2012, 23:31   #1
Cerebrum
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 24
По умолчанию Ключевое слово out в вызове функции. Указатели

В С# месяц. Пришлось задействовать OpenCV для С#.
Надо выделить контуры на бинарном изображении. Использовал статью. Всю ее читать и не обязательно... Прописал код:
Код:
private void button5_Click(object sender, EventArgs e)
{
    CvMemStorage storage = Cv.CreateMemStorage(0);
    CvSeq contours=null;
    int contoursCont = Cv.FindContours(pictold, storage, &contours, CvContour.SizeOf, ContourRetrieval.List, ContourChain.ApproxSimple, Cv.Point(0, 0));
    drawpict(pictold, pictnew, graph.pictureBox1);
}
В эквивалент кода на С++
Код:
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* contours=0;
int contoursCont = cvFindContours( bin, storage,&contours,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
Вопрос в вызове функции FindContours:
Код:
public static int FindContours(CvArr image, CvMemStorage storage, out CvSeq<CvPoint> first_contour, int header_size, ContourRetrieval mode, ContourChain method, CvPoint offset);
image — исходное 8-битное одноканальное изображение.
storage — хранилище памяти для хранения данных найденных контуров
first_contour — указатель, который будет указывать на первый элемент последовательности, содержащей данные найденных контуров
header_size — размер заголовка элемента последовательности
mode — режим поиска и т.д.

А если точнее, вопрос по 3-му параметру (out CvSeq<CvPoint> first_contour).
В примере, что написан на С++, прописан указатель на первый контур &contours, чего в С# явно не достаточно. Компилятор на это пишет:
Цитата:
Невозможно получить адрес, определить размер или объявить указатель на управляемый тип ("OpenCvSharp.CvSeq")
В свойствах проекта включил возможность небезопасного кода, для использования указателей в коде.
До этого не возникало никаких проблем с пользованием библиотеки. Может кто поможет разобраться с указателями. Пока не особо понимаю данную вещь... рад любой помощи, направьте на статьи может какие, либо способ, который заставит работать данную функцию...
Cerebrum вне форума Ответить с цитированием
Старый 13.01.2012, 23:32   #2
Cerebrum
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 24
По умолчанию

Привожу заодно класс СvSeq:
Код:
public class CvSeq : CvTreeNode<CvSeq>, ICloneable
    {
        protected CvMemStorage _storage;
        public static readonly int SizeOf;

        protected CvSeq();
        public CvSeq(IntPtr ptr);
        public CvSeq(SeqType seq_flags, int elem_size, CvMemStorage storage);
        public CvSeq(SeqType seq_flags, int header_size, int elem_size, CvMemStorage storage);

        public IntPtr BlockMax { get; }
        public int DeltaElems { get; }
        public int ElemSize { get; }
        public CvSeqBlock First { get; }
        public CvSeqBlock FreeBlocks { get; }
        public override CvSeq HNext { get; }
        public override CvSeq HPrev { get; }
        public IntPtr Ptr { get; }
        public CvMemStorage Storage { get; }
        public int Total { get; }
        public override CvSeq VNext { get; }
        public override CvSeq VPrev { get; }

        public void CalcPGH(CvHistogram hist);
        public void ClearSeq();
        public virtual CvSeq Clone();
        public virtual CvSeq Clone(CvMemStorage storage);
        public CvMoments ContoursMoments();
        public CvContourTree CreateContourTree(CvMemStorage storage, double threshold);
        public int ElemIdx<T>(T element) where T : struct;
        public int ElemIdx<T>(T element, out CvSeqBlock block) where T : struct;
        public T? GetSeqElem<T>(int index) where T : struct;
        protected override void Initialize(IntPtr ptr);
        public virtual T Insert<T>(int before_index, T element) where T : struct;
        public virtual void InsertSlice(int before_index, CvArr from_arr);
        public void Invert();
        public int Partition(CvMemStorage storage, out CvSeq labels, CvCmpFunc is_equal);
        public virtual T Pop<T>() where T : struct;
        public virtual T PopFront<T>() where T : struct;
        public T[] PopMulti<T>(int count, InsertPosition in_front) where T : struct;
        public virtual IntPtr Push();
        public virtual T Push<T>(T element) where T : struct;
        public virtual T PushFront<T>(T element) where T : struct;
        public void PushMulti<T>(T[] elements, InsertPosition in_front) where T : struct;
        public virtual void Remove(int index);
        public void RemoveSlice(CvSlice slice);
        public virtual IntPtr Search(IntPtr elem, CvCmpFunc func, bool is_sorted, out int elem_idx);
        public virtual void SetBlockSize(int delta_elems);
        public virtual CvSeq Slice(CvSlice slice);
        public virtual CvSeq Slice(CvSlice slice, CvMemStorage storage);
        public virtual CvSeq Slice(CvSlice slice, CvMemStorage storage, bool copy_data);
        public virtual void Sort(CvCmpFunc func);
        public CvSeqWriter StartAppend();
        public virtual void StartRead(CvSeqReader reader);
        public virtual void StartRead(CvSeqReader reader, bool reverse);
        public T[] ToArray<T>() where T : struct;
        public T[] ToArray<T>(CvSlice slice) where T : struct;
    }
Cerebrum вне форума Ответить с цитированием
Старый 13.01.2012, 23:47   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Нужно вызывать, явно указывая, что параметр - out. out-параметры - это не указатели, но ссылки.

Код:
int contoursCont = Cv.FindContours(pictold, storage, out contours, CvContour.SizeOf, ContourRetrieval.List, ContourChain.ApproxSimple, Cv.Point(0, 0));
netrino вне форума Ответить с цитированием
Старый 14.01.2012, 00:25   #4
Cerebrum
Пользователь
 
Регистрация: 21.03.2009
Сообщений: 24
По умолчанию

Хм... и так пытался, В итоге компилятор пишет:
Цитата:
Аргумент "3": преобразование типа из "out OpenCvSharp.CvSeq" в "out OpenCvSharp.CvSeq<OpenCvSharp.CvPoi nt>" невозможно
Разобрался. Следовало при определении contours указать еще:
Код:
CvSeq <OpenCvSharp.CvPoint> contours = null;
Спасибо

Последний раз редактировалось Cerebrum; 14.01.2012 в 00:34.
Cerebrum вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перекрытие вариабл при повторном вызове функции KOTBASILIO JavaScript, Ajax 0 18.07.2011 19:09
Ошибка при вызове функции Access violation Hottabych Win Api 1 22.01.2011 20:35
зачем нужно ипользовать ключевое слово super? Syltan Общие вопросы по Java, Java SE, Kotlin 16 20.05.2010 19:06
Ошибка при вызове хранимой функции MySQL tavrocotaps Общие вопросы .NET 0 23.04.2010 10:25
MSVC++: ключевое слово operator Пепел Феникса Общие вопросы C/C++ 2 20.10.2009 21:32