Запутывающие ошибки с opencv cvLoadImage и netbeans - PullRequest
2 голосов
/ 22 января 2010

Я нашел эту удобную библиотеку opencv и попытался запрограммировать простой модификатор изображений с помощью языка C. Когда я начал компилировать свой код, у меня появилось несколько ошибок, которые немного сбивают с толку, поскольку, похоже, не имеют смысла. Это мой первый раз, когда я программирую с NetBeans, и впервые я пытаюсь сделать что-то еще, кроме этих базовых калькуляторов и т. Д. Программ. Ниже приведен код и ошибки, которые выдает компилятор:

int iscolor = -1; /* Used to load the image as it is*/
IplImage* image = 0;

/* Load Image */
image = cvLoadImage(const char* 'test.jpg', iscolor); /* line 34 */

/*Modify image*/
...

/* Save Image */
int cvSaveImage(const char* 'modified.jpg', const CvArr* image); /* line 43 */

/*End*/

Ошибки компиляции

main.c: в функции «main»:

main.c: 34: ошибка: ожидаемое выражение до "const"

main.c: 34: 37: предупреждение: символ константа слишком длинная для своего типа

main.c: 34: ошибка: слишком мало аргументов для функция cvLoadImage

main.c: 43: 33: предупреждение: символ константа слишком длинная для своего типа

main.c: 43: ошибка: ожидается ‘;’, ‘,’ или ‘)’ До '\ x2e6a7067'

Эти ошибки меня немного смущают, потому что

  1. ссылка на ссылку opencv c cvLoadImage принимает только два аргумента.
  2. почему константа символа слишком длинная?
  3. ожидаемое выражение перед const? хммм ... я совсем не понимаю
  4. ожидается ‘;’, ‘,’ или ‘)’ до 'x2e6a7067' ... ну, я тоже не понимаю

    Так может кто-нибудь сказать мне, что я делаю не так? Любая помощь была бы хороша:)

Ответы [ 2 ]

2 голосов
/ 23 января 2010

В C одинарные кавычки используются для обозначения единичных (буквальных) символьных констант, а результирующий тип таких констант равен int. Итак, 'a' - это нормально, 'a1' - нет, потому что это два символа. C определяет некоторые escape-последовательности, например '\n', который обрабатывается как один символ, обозначающий новую строку, или '\xff', который является символом с шестнадцатеричным значением 0xff. Поскольку 'test.jpg' содержит более одного символа, компилятор сообщает вам, что ваша константа литерального символа слишком длинная. Вы хотите строку, которая нуждается в двойных кавычках.

Вам необходимо заключить в скобки скобки: (const char *)x - это нормально, const char * x - нет (хорошо, если вы объявите x как const char *). Я думаю, что вы добавили это преобразование, потому что компилятор предупреждал вас о "преобразовании int в указатель без преобразования". В общем, если вы действительно не знаете, что делаете, приведение компилятора в тишину - очень плохая идея.

Исходя из вышеизложенного, строка 34 должна быть:

image = cvLoadImage("test.jpg", iscolor);

Если вы действительно хотите разыграть "test.jpg" как const char *, выполните:

image = cvLoadImage((const char *)"test.jpg", iscolor);

Также теперь вы знаете, как исправить эту строку:

int cvSaveImage(const char* 'modified.jpg', const CvArr* image);
0 голосов
/ 22 января 2010

Вы должны выучить некоторый язык программирования c, взять книгу или что-то в этом роде ...

правильные строки будут:

34: image = cvLoadImage ('test.jpg', iscolor);

43: int result = cvSaveImage ('ified.jpg ', image);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...