|
问题背景:想用mfc和opencv相结合写个小程序。做到保存按钮的时候出了点问题
具体就是想用imwrite将处理后的图片进行保存。结果不加这句话的时候在release下能调通,加了以后就会报错。错误是error LNK2001: 无法解析的外部符号 "class cv::Mat dst"和fatal error LNK1120: 1 个无法解析的外部命令
下面我描述一下我写的这句话:
第一个参数是从编辑框获取到的保存路径,没问题。问题应该在第二个参数上。
由于处理后的图片是在另一个按钮下得到的,所以我就把那个dst定义成了全局变量,想着这样以后就能在这个保存按钮下直接用了
结果就会报那样的错误
下面我就把处理图片的按钮和这个保存按钮的代码贴出来(还有上面这句声明全局变量的),别的也用不上,都贴出来太乱了
- <div>void CMFCApplication1Dlg::OnBnClickedButton4()
- {
- TCHAR szedittext[MAX_PATH] = {0};
- GetDlgItem(IDC_EDIT1)->GetWindowText(szedittext,MAX_PATH);//得到编辑框中的文件路径
- Mat src = imread(szedittext);
- if (src.empty())
- {
- MessageBox(_T("could not load image...\n"));
- }
- namedWindow("输入窗口", WINDOW_FREERATIO);
- imshow("输入窗口", src);
- Mat dst;
- blur(src,dst,Size(5,5),Point(-1,-1));
- imshow("图像模糊",dst);</div><div>
- waitKey(0);
- destroyAllWindows();
- }
- //===========================================================================================下面这部分是点了保存按钮之后将模糊后的图片保存至选定的文件路径中
- void CMFCApplication1Dlg::OnBnClickedButton3()
- {
- // TODO: 在此添加控件通知处理程序代码
- TCHAR szedittext[MAX_PATH] = { 0 };
- GetDlgItem(IDC_EDIT2)->GetWindowText(szedittext, MAX_PATH);//得到编辑框中的文件路径
- imwrite(szedittext,dst);
- }</div>
复制代码 求大侠们指点迷津,或者教教我这种按钮之间数据传递的话应该这么写呢,
新手刚入门,大佬们轻点儿骂哈,谢谢啦
本帖最后由 cpp2019 于 2021-8-29 02:17 编辑
要在几个方法中使用可以声明为“成员”变量,当然全局也是可以的,问题是你声明了全局变量为什么又使用局部变量来保存处理结果呢?
先把变量作用域搞清楚,把基础学扎实了,你这一上来就opencv!
你的保存按钮仅仅是保存文件,不需要选择路径,单独搞个按钮显示有点多余。
引起报错的语句:
extern Mat dst;
这个不叫声明全局变量, 这叫做引用声明,只有在引用外部文件中的全局变量时需要使用extern进行引用声明。
extern的正确用法:
test.h:
- #pragma once
- int main();
- int test();
复制代码
test.cpp:
- #include "test.h"
- int nRet = 888;
- int test()
- {
- return nRet;
- }
复制代码
main.cpp:
- #include <iostream>
- #include "test.h"
- extern int nRet;
- int main()
- {
- std::cout << nRet << "\n";
- }
复制代码
|
上一篇: 通用对话框下一篇: 编辑框控件过滤回显
|