Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lecture3/homework/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ message(STATUS "--------------------CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}-------
find_package(OpenCV REQUIRED)
find_package(fmt REQUIRED)
find_package(Eigen3 REQUIRED)
# find_package(spdlog REQUIRED)
find_package(spdlog REQUIRED)
find_package(yaml-cpp REQUIRED)
# find_package(nlohmann_json REQUIRED)
set(OpenVINO_DIR "/opt/intel/openvino_2024.6.0/runtime/cmake/")
Expand Down
95 changes: 95 additions & 0 deletions lecture3/homework/io/my_camera.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
#include "my_camera.hpp"
#include <iostream>

myCamera::myCamera()
: _handle_(nullptr),
_wait_msec_(100),
_is_grabbing_(false),
_is_device_opened_(false),
_is_handle_created_(false) {
int ret = MV_CC_EnumDevices(MV_USB_DEVICE, &_device_list_);
}

myCamera::~myCamera() {
if (_is_grabbing_) {
int ret = MV_CC_StopGrabbing(_handle_);
if (ret == MV_OK) {
_is_grabbing_ = false;
}
}

if (_is_device_opened_) {
int ret = MV_CC_CloseDevice(_handle_);
if (ret == MV_OK){
_is_device_opened_ = false;
}
}

if (_is_handle_created_) {
int ret = MV_CC_DestroyHandle(_handle_);
if (ret == MV_OK){
_handle_ = nullptr;
_is_handle_created_ = false;
}
}
}

cv::Mat myCamera::_transfer_frame_(MV_FRAME_OUT& raw) {
cv::Mat img(cv::Size(raw.stFrameInfo.nWidth, raw.stFrameInfo.nHeight), CV_8U, raw.pBufAddr);
MV_CC_PIXEL_CONVERT_PARAM cvt_param;
cvt_param.nWidth = raw.stFrameInfo.nWidth;
cvt_param.nHeight = raw.stFrameInfo.nHeight;
cvt_param.pSrcData = raw.pBufAddr;
cvt_param.nSrcDataLen = raw.stFrameInfo.nFrameLen;
cvt_param.enSrcPixelType = raw.stFrameInfo.enPixelType;
cvt_param.pDstBuffer = img.data;
cvt_param.nDstBufferSize = img.total() * img.elemSize();
cvt_param.enDstPixelType = PixelType_Gvsp_BGR8_Packed;
auto pixel_type = raw.stFrameInfo.enPixelType;
cv::cvtColor(img, img, _type_map_.at(pixel_type));
return img;
}

bool myCamera::read(cv::Mat& frame) {
if (_device_list_.nDeviceNum == 0) {
return false;
}

if (!_is_handle_created_) {
int ret = MV_CC_CreateHandle(&_handle_, _device_list_.pDeviceInfo[0]);
if (ret != MV_OK) {
return false;
}
_is_handle_created_ = true;
}

if (!_is_device_opened_) {
int ret = MV_CC_OpenDevice(_handle_);
if (ret != MV_OK) {
return false;
}
_is_device_opened_ = true;
int ret_param = 0;
ret_param = MV_CC_SetEnumValue(_handle_, "BalanceWhiteAuto", MV_BALANCEWHITE_AUTO_CONTINUOUS);
ret_param = MV_CC_SetEnumValue(_handle_, "ExposureAuto", MV_EXPOSURE_AUTO_MODE_OFF);
ret_param = MV_CC_SetEnumValue(_handle_, "GainAuto", MV_GAIN_MODE_OFF);
ret_param = MV_CC_SetFloatValue(_handle_, "ExposureTime", 10000);
ret_param = MV_CC_SetFloatValue(_handle_, "Gain", 20);
ret_param = MV_CC_SetFrameRate(_handle_, 60);
}

if (!_is_grabbing_) {
int ret = MV_CC_StartGrabbing(_handle_);
if (ret != MV_OK) {
return false;
}
_is_grabbing_ = true;
}
int ret = MV_CC_GetImageBuffer(_handle_, &_raw_frame_, _wait_msec_);
if (ret != MV_OK) {
return false;
}
frame = _transfer_frame_(_raw_frame_);
ret = MV_CC_FreeImageBuffer(_handle_, &_raw_frame_);
return true;
}
30 changes: 30 additions & 0 deletions lecture3/homework/io/my_camera.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#ifndef MY_CAMERA_HPP
#define MY_CAMERA_HPP

#include "io/hikrobot/include/MvCameraControl.h"
#include <opencv2/opencv.hpp>
#include <unordered_map>

class myCamera {
public:
myCamera();
~myCamera();
bool read(cv::Mat& frame);
private:
void* _handle_;
MV_CC_DEVICE_INFO_LIST _device_list_;
MV_FRAME_OUT _raw_frame_;
unsigned int _wait_msec_;
bool _is_grabbing_;
bool _is_device_opened_;
bool _is_handle_created_;
const std::unordered_map<MvGvspPixelType, cv::ColorConversionCodes> _type_map_ = {
{PixelType_Gvsp_BayerGR8, cv::COLOR_BayerGR2RGB},
{PixelType_Gvsp_BayerRG8, cv::COLOR_BayerRG2RGB},
{PixelType_Gvsp_BayerGB8, cv::COLOR_BayerGB2RGB},
{PixelType_Gvsp_BayerBG8, cv::COLOR_BayerBG2RGB}
};
cv::Mat _transfer_frame_(MV_FRAME_OUT& raw);
};

#endif
46 changes: 30 additions & 16 deletions lecture3/homework/main.cpp
Original file line number Diff line number Diff line change
@@ -1,27 +1,41 @@
#include <iostream>
#include <opencv2/opencv.hpp>
#include "io/my_camera.hpp"
#include "tasks/yolo.hpp"
#include "opencv2/opencv.hpp"
#include "tasks/armor.hpp"
#include "tools/img_tools.hpp"

int main()
{
// 初始化相机、yolo类

// while (1) {
// 调用相机读取图像
int main() {
myCamera camera;
auto_aim::YOLO yolo("./configs/yolo.yaml");
cv::Mat frame;
std::list<auto_aim::Armor> armors;
int frame_count = 0;

while (true) {
if (!camera.read(frame)) {
cv::waitKey(1000);
continue;
}

// 调用yolo识别装甲板
armors = yolo.detect(frame, frame_count);
frame_count++;

for (const auto& armor : armors) {
std::vector<cv::Point> armor_points;
for (const auto& pt : armor.points) {
armor_points.emplace_back(cv::Point(static_cast<int>(pt.x), static_cast<int>(pt.y)));
}
tools::draw_points(frame, armor_points, cv::Scalar(0, 0, 255), 2);
}

cv::imshow("Camera-YOLO Armor Detection", frame);

// 显示图像
// cv::resize(img, img , cv::Size(640, 480));
// cv::imshow("img", img);
// if (cv::waitKey(0) == 'q') {
// // break;
// }
// }
if (cv::waitKey(1) == 27) {
break;
}
}

cv::destroyAllWindows();
return 0;
}
}
29 changes: 19 additions & 10 deletions lecture3/part1/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,26 @@ using namespace std;

class Material
{

public:
Material(){
printf("Material Default Constructor!\n");
};
void print(){
printf("This is a Material Object!\n");
};
~Material(){
printf("Material Destuctor!\n");
};
};

// int main()
// {
// cout << "--- 构造函数 ---" << endl;
// Material m;
int main()
{
cout << "--- 构造函数 ---" << endl;
Material m;

// cout << "\n--- print函数 ---" << endl;
// m.print();
cout << "\n--- print函数 ---" << endl;
m.print();

// cout << "\n--- 自动进行析构函数 ---" << endl;
// return 0;
// }
cout << "\n--- 自动进行析构函数 ---" << endl;
return 0;
}
33 changes: 23 additions & 10 deletions lecture3/part2/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,30 @@ using namespace std;

class Material
{

public:
Material(){
printf("Material Default Constructor!\n");
};
void print(){
printf("This is a Material Object!\n");
count_++;
};
~Material(){
printf("Material Destuctor!It has been read %d times\n",count_);
};
private:
int count_=0;
};

// int main()
// {
// cout << "--- 构造函数 ---" << endl;
// Material m;
int main()
{
cout << "--- 构造函数 ---" << endl;
Material m;
Material n;

// cout << "\n--- print函数 ---" << endl;
// m.print();
cout << "\n--- print函数 ---" << endl;
m.print();

// cout << "\n--- 自动进行析构函数 ---" << endl;
// return 0;
// }
cout << "\n--- 自动进行析构函数 ---" << endl;
return 0;
}
27 changes: 16 additions & 11 deletions lecture4/class/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,12 @@ static const double ARMOR_WIDTH = 0.135; // 装甲板宽度 单位:米
// 对于我们而言,也就是装甲板坐标系下4个点的坐标。
// 请你填写下面的 object_points:

// static const std::vector<cv::Point3f> object_points {
// { , , 0 }, // 点 1
// { , , 0 }, // 点 2
// { , , 0 }, // 点 3
// { , , 0 } // 点 4
// };
static const std::vector<cv::Point3f> object_points {
{-ARMOR_WIDTH/2,-LIGHTBAR_LENGTH/2, 0 }, // 点 1
{ARMOR_WIDTH/2,-LIGHTBAR_LENGTH/2, 0 }, // 点 2
{ARMOR_WIDTH/2,LIGHTBAR_LENGTH/2, 0 }, // 点 3
{-ARMOR_WIDTH/2,LIGHTBAR_LENGTH/2, 0 } // 点 4
};

// 提示:
// - 装甲板坐标系是三维的坐标系,但是四个点都在 z 坐标为 0 的平面上,所以已经为你填写了四个 0 。
Expand Down Expand Up @@ -61,7 +61,7 @@ int main(int argc, char *argv[])
// 对于我们而言,也就是 照片上 装甲板 4个点的坐标。
// 请你填写下面的 img_points:
//
// std::vector<cv::Point2f> img_points{ , , , };
std::vector<cv::Point2f> img_points{armor.left.top,armor.right.top,armor.right.bottom,armor.left.bottom};
//
// 提示:
// - 看看 Armor 结构体有哪些成员。
Expand All @@ -77,7 +77,7 @@ int main(int argc, char *argv[])
// rvec 和 tvec 用于存储 solvePnP 输出的结果。
// 你需要在下面填写 输入给 solvePnP 的参数:
//
// cv::solvePnP(, , , , rvec, tvec);
cv::solvePnP(object_points,img_points,camera_matrix,distort_coeffs, rvec, tvec);
//
// #########################################################

Expand All @@ -87,8 +87,8 @@ int main(int argc, char *argv[])
// 现在,draw_text 只打印 0.0
// 请你改写下面draw_text的参数,把解得的 tvec 和 rvec 打印出来
//
tools::draw_text(img, fmt::format("tvec: x{: .2f} y{: .2f} z{: .2f}", 0.0, 0.0, 0.0), cv::Point2f(10, 60), 1.7, cv::Scalar(0, 255, 255), 3);
tools::draw_text(img, fmt::format("rvec: x{: .2f} y{: .2f} z{: .2f}", 0.0, 0.0, 0.0), cv::Point2f(10, 120), 1.7, cv::Scalar(0, 255, 255), 3);
tools::draw_text(img, fmt::format("tvec: x{: .2f} y{: .2f} z{: .2f}", tvec.at<double>(0),tvec.at<double>(1),tvec.at<double>(2)), cv::Point2f(10, 60), 1.7, cv::Scalar(0, 255, 255), 3);
tools::draw_text(img, fmt::format("rvec: x{: .2f} y{: .2f} z{: .2f}", rvec.at<double>(0),rvec.at<double>(1),rvec.at<double>(2)), cv::Point2f(10, 120), 1.7, cv::Scalar(0, 255, 255), 3);
//
// 提示:
// - 使用 tvec.at<double>(0),可以得到一个double变量,它是tvec中首个元素的值。
Expand All @@ -100,7 +100,12 @@ int main(int argc, char *argv[])
// 使用 cv::Rodrigues ,把 rvec 旋转向量转换为 rmat 旋转矩阵。
// 再使用反三角函数,把旋转矩阵 rmat 中的元素转化为欧拉角,并在画面上显示。
//
tools::draw_text(img, fmt::format("euler angles: yaw{: .2f} pitch{: .2f} roll{: .2f}", 0.0, 0.0, 0.0), cv::Point2f(10, 180), 1.7, cv::Scalar(0, 255, 255), 3);
cv::Mat rmat;
cv::Rodrigues(rvec,rmat);
double yaw=atan2(rmat.at<double>(0,2),rmat.at<double>(2,2));
double pitch=-asin(rmat.at<double>(1,2));
double roll=atan2(rmat.at<double>(1,0),rmat.at<double>(1,1));
tools::draw_text(img, fmt::format("euler angles: yaw{: .2f} pitch{: .2f} roll{: .2f}",yaw,pitch,roll), cv::Point2f(10, 180), 1.7, cv::Scalar(0, 255, 255), 3);
//
// 提示:
// - cv::Mat 的下标从0开始,而不是1。
Expand Down
2 changes: 1 addition & 1 deletion lecture4/homework/io/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
else()
message(FATAL_ERROR "Unsupported architecture: ${CMAKE_HOST_SYSTEM_PROCESSOR}!")
endif()
target_link_libraries(io MvCameraControl MVSDK usb-1.0)
target_link_libraries(io MvCameraControl usb-1.0)

Loading