Ошибка выполнения 64-битной сборки EmguCV

Я столкнулся с проблемами при преобразовании существующего 32-разрядного EmguCV (Версия 2.3) в 64-разрядный с использованием .net 4.0 и VS2010 в ОС W7/x64. Я приобрел коммерческую лицензию, если это имеет значение, и скачал ее по ссылкам, указанным в квитанции.

Ошибка

System.TypeInitializationException was unhandled
 Message=The type initializer for 'Emgu.CV.CvInvoke' threw an exception.
 Source=Emgu.CV
 TypeName=Emgu.CV.CvInvoke

Я следовал инструкциям, приведенным в этой статье. На самом деле, я использовал образцы проектов в статье, и они отлично работают с V2.2, но когда я заменяю двоичные файлы V2.3 (как emgu, так и opencv), возникает ошибка.

Кто-нибудь успешно создал проект Emgu (Версия 2.3.x) x64? Пожалуйста, дайте некоторые рекомендации.


person Mikos    schedule 27.10.2011    source источник
comment
и Да, я добавил правильные двоичные файлы из opencv в свою папку отладки. Так что это не может быть просто ошибка отсутствия dll.   -  person Mikos    schedule 27.10.2011
comment
Привет, Микос, мне было довольно забавно обнаружить, что статья была написана мной. Сейчас я посмотрю на проблему и вернусь к вам. Ваше здоровье   -  person Chris    schedule 27.10.2011
comment
@ Крис, спасибо. Я следовал вашим инструкциям в письме - это действительно было очень полезно. Искренне ценим вашу помощь и поддержку.   -  person Mikos    schedule 28.10.2011
comment
Привет, я скомпилировал проекты с помощью EMGU 2.3.0 x64, и все работает нормально. Упомянутая вами ошибка может быть связана с тем, что вы не ориентируетесь на правильную платформу. Читает ли InnerException {Была предпринята попытка загрузить программу с неправильным форматом. (Исключение из HRESULT: 0x8007000B)} если да, то проблема в этом. Если нет, не могли бы вы опубликовать это, чтобы я мог попытаться воссоздать проблему. Ваше здоровье   -  person Chris    schedule 28.10.2011
comment
преобразование из Image‹Emgu.CV.Structure.Bgra, System.Byte› в Image‹Emgu.CV.Structure.Bgr, System.Byte› не поддерживается OpenCV   -  person Mikos    schedule 28.10.2011
comment
Ошибка, с которой я сталкиваюсь, - это TypeInitializationException, за которой следует вышеуказанная ошибка преобразования (sic). Я не уверен, в чем проблема. Спасибо за вашу помощь.   -  person Mikos    schedule 28.10.2011
comment
Есть ли пример проекта, которым вы можете поделиться с emgu 2.3 (x64), которым вы можете поделиться?   -  person Mikos    schedule 28.10.2011
comment
Итак, это когда вы конвертируете между типами изображений. Скорее всего, вы пытаетесь преобразовать более одного типа данных одновременно, EMGU по какой-то причине это не нравится. Поэтому, если бы я хотел преобразовать из ‹Bgr, Byte› в ‹Bgra, Double›, мне пришлось бы сделать следующее Image‹Bgra, Double› My_double_image = my_BGR_BYTE_Image.Convert‹Bgra, Byte›().Convert‹Bgra, Double› (); Мне удалось воспроизвести аналогичную ошибку путем преобразования в «Bgr, Double», а затем в «Bgra, Double», поэтому теперь мне нужно преобразовать глубину изображения перед типом данных. Если это не поможет, опубликуйте код, который вызывает ошибку.   -  person Chris    schedule 28.10.2011
comment
Я загружу новые версии 2.3.0 в проект кода, как только у меня появится шанс на работе.   -  person Chris    schedule 28.10.2011
comment
Кодовая база доступна здесь: yousendit.com/download/T2dmNnFJYXk1R05WeHNUQw   -  person Mikos    schedule 28.10.2011
comment
давайте продолжим это обсуждение в чате   -  person Mikos    schedule 28.10.2011


Ответы (3)


Причина этой ошибки (если кто-то еще столкнется с той же проблемой) заключается в том, что программа не может получить доступ к opencv_imgproc231.dll или opencv_core231.dll, даже если они присутствуют в выходном каталоге «bin».

Есть два решения:

  1. Добавьте их в проект и задайте для их свойств значение copy always, поскольку они являются двумя ключевыми файлами EMGU.

  2. Если шаг 1 не работает, замените текущие файлы ключей в папке bin новыми копиями.

Если оба метода не срабатывают, возможно, возникла проблема со сборкой, поэтому загрузите новую копию EMGU с Sourceforge и повторите попытку. Позже ошибка будет включена в техническую статью, чтобы дать более четкое объяснение того, как ее решить.

Привет, Крис

person Chris    schedule 28.10.2011
comment
Привет @Крис. Я попытался добавить эти две ссылки в свой проект, но почему-то мне не разрешили их добавить. Он сказал Reference could not added reason being it is not accessible or it is not a valid assembly/COM component . Пожалуйста помоги! - person ykombinator; 09.01.2012
comment
Привет, упомянутые файлы представляют собой неуправляемый код opencv, который эффективно обертывает EMGU, они не являются компонентами .NET и должны быть добавлены в выходной каталог или как существующие файлы в вашем проекте. См. мою статью на codeproject, и она проведет вас через codeproject.com/KB/cs/ EMGU_Image_Processing.aspx Удачи! - person Chris; 09.01.2012

Не нужно добавлять их в проект; ВС вас не подпустит. Просто откройте FaceRecognizer.cs в public static partial class CvInvoke и измените:

[DllImport(CvInvoke.EXTERN_LIBRARY, CallingConvention = CvInvoke.CvCallingConvention)] 

to:

[DllImport(Emgu.CV.CvInvoke.EXTERN_LIBRARY, CallingConvention = Emgu.CV.CvInvoke.CvCallingConvention)] 

Убедитесь, что вы изменили их все.

person Nnanna Okorie    schedule 18.09.2012

Сначала протестируйте таким образом: откройте образец проекта из каталога установки emgu cv и запустите его. например, откройте пример hello world и попробуйте запустить его. если примеры проектов запускаются без проблем, то установка выполнена правильно.

Для примеров проектов emgu cv значение параметра Выходной путь в настройках Build проекта установлено на '..\.. \ бин '. Чтобы устранить проблему с проектом, откройте проект в Visual Studio и установите для параметра Выходной путь значение 'C:\Emgu\emgucv 2.9\bin'. Попробуйте запустить проект. Он должен работать с успехом.

Теперь верните значение параметра «Путь вывода» на bin\Debug\. Затем добавьте все DLL-файлы из папки 'C:\Emgu\emgucv 2.9\bin' в свой проект, используя меню ADD -> Existing Item. аналогичным образом добавьте все DLL-файлы из папки 'C:\Emgu\emgucv 2.9\bin\x64' в свой проект, используя меню ADD -> Existing Item. Теперь перейдите в окно свойств и установите для параметра Копировать в выходной каталог для всех dll-файлов значение Копировать всегда. Наконец, в окне Configuration Manager создайте новую конфигурацию для платформы x64.

Удачи

person Vahid    schedule 30.01.2014