我找到了方便的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:错误:参数太少 function'cvLoadImage'
main.c:43:33:警告:性格 对于它的类型来说,它常常太长了
main.c:43:错误:预期';',','或 ')'之前'\ x2e6a7067'
这些错误让我感到困惑,因为
预期';',','或')'在'\ x2e6a7067'之前'......好吧我也没有得到这个
那么有人能告诉我我做错了什么吗?任何帮助都会很好:)
答案 0 :(得分:2)
在C中,单引号用于表示单个(文字)字符常量,此类常量的结果类型为int
。因此,'a'
没问题,'a1'
不是,因为这是两个字符。 C定义了一些转义序列,例如'\n'
,它被视为表示换行符的一个字符,或'\xff'
,它是具有十六进制值0xff
的字符。由于'test.jpg'
包含多个字符,编译器会告诉您文字字符常量太长。你想要一个需要双引号的字符串。
你需要在演员表周围放置括号:(const char *)x
没关系,const char * x
不是(如果你将x
声明为const char *
,那就没关系)。我认为你添加了cast,因为编译器警告你“将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);
答案 1 :(得分:0)
你应该学习一些c编程语言,拿一本书或其他东西......
正确的行将是:
34:image = cvLoadImage('test.jpg',iscolor);
43:int result = cvSaveImage('modified.jpg',image);