虽然课程有提供配好环境的虚拟机,但我电脑运行起来比较慢...所以在开始学习前配了半天环境XD
环境配置参考,我用的是vs2019,这里记录下遇到的几个问题。
问题
安装OpenCV时报错
mingw32-make[1]: CMakeFiles\Makefile2: No such file or directory
mingw32-make[1]: *** No rule to make target 'CMakeFiles\Makefile2'. Stop.
mingw32-make: *** [Makefile:179: all] Error 2
解决方法:更改了下目标文件夹解决问题,就很玄学...猜测是因为路径里不能有括号之类的特殊符号?
编译文件时提示 fatal error: Eigen3/Core: No such file or directory
解决方法:在 CMakeLists.txt 里添加
include_directories("你的eigen3路径/Eigen3/include/eigen3")
引入eigen3库用
#include<Eigen/Eigen>
使用opencv相关函数时报错如下
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2019 无法解析的外部符号 "void __cdecl cv::fastFree(void *)" (?fastFree@cv@@YAXPEAX@Z),函数 "public: __cdecl cv::Mat::~Mat(void)" (??1Mat@cv@@QEAA@XZ) 中引用了该符号 D:\code\graphics\Assignment1\frame\out\build\x64-Debug (默认值)\frame D:\code\graphics\Assignment1\frame\out\build\x64-Debug (默认值)\main.cpp.obj 1
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2019 无法解析的外部符号 "void __cdecl cv::error(int,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,char const *,char const *,int)" (?error@cv@@YAXHAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@PEBD1H@Z),函数 "public: int const & __cdecl cv::MatSize::operator[](int)const " (??AMatSize@cv@@QEBAAEBHH@Z) 中引用了该符号 D:\code\graphics\Assignment1\frame\out\build\x64-Debug (默认值)\frame D:\code\graphics\Assignment1\frame\out\build\x64-Debug (默认值)\main.cpp.obj 1
解决方法:出错原因大约是没找到链接库,网上翻了半天都是c++项目的解法,明显不能用于cmake项目
所以是时候学一波cmake语法了~可以参考下面的CMakeLists.txt,把库链接进来
cmake_minimum_required(VERSION 3.10)
project(Rasterizer)
find_package(OpenCV REQUIRED)
set(CMAKE_CXX_STANDARD 17)
include_directories("C:/Program Files (x86)/Eigen3/include/eigen3")
include_directories( ${OpenCV_INCLUDE_DIRS} )
#指定要引用的dll的头文件所在路径
include_directories("D:/opencv/opencv/build/include")
#指定该dll的lib所在路径
link_directories("D:/opencv/opencv/build/x64/vc15/lib")
# 将源代码添加到此项目的可执行文件
add_executable(Rasterizer main.cpp rasterizer.hpp rasterizer.cpp Triangle.hpp Triangle.cpp)
target_link_libraries(Rasterizer ${OpenCV_LIBRARIES})
#指定链接库的名字,即该dll
# opencv_world450d.lib在..\opencv\build\x64\vc15\lib目录下,名字可能会稍有差别
target_link_libraries(Rasterizer opencv_world450d)
GAMES101 作业0
题目:给定一个点 P=(2,1), 将该点绕原点先逆时针旋转 45◦,再平移 (1,2), 计算出 变换后点的坐标(要求用齐次坐标进行计算)
关于齐次坐标,我的理解是将二维坐标三维化,可以将原本是矩阵加法的平移转化为矩阵乘法,方便进行旋转平移缩放等一系列运算。
代码:(注意浮点数的表示)
#include<cmath>
#include<Eigen/Core>
#include<Eigen/Dense>
#include<iostream>
using namespace std;
using namespace Eigen;
#define PI acos(-1)
int main(){
Vector3d P(2.0f, 1.0f, 1.0f);
Matrix3d rot, tra;
double ang = 45.0/180.0 * PI;
rot <<
cos(ang), -sin(ang), 0,
sin(ang), cos(ang), 0,
0, 0, 1;
tra <<
1, 0, 1,
0, 1, 2,
0, 0, 1;
cout << tra * rot * P << endl;
return 0;
}
加油!