安装了 VSCode 并安装了 CMake 和 C/C++ 插件。在终端输入gcc --version
发现系统未安装gcc。输入sudo apt install gcc
后得以安装。后使用sudo apt install cmake
命令安装了 CMake。使用 VSCode 创建初始项目测试,并未发现任何问题。
根据任务书的指引,无任何问题。
阅读了,对OpenCV中的功能、数据存储形式有了大致的了解。
找到了一份非官方的,对任务书的中的每个功能进行检索,查阅相关的函数。
- 图像颜色空间转换(备注:
cvtColor()
的第三个参数中的“CV”应改为"COLOR“,如"CV_BGRA2GRAY"应改为"COLOR_BGRA2GRAY"。这可能是因为 OpenCV 版本不同造成的问题) - 应用各种滤波操作
- 特征提取
对于区域和轮廓的处理,想到遍历图像中每个像素分别进行判断的方法。- 寻找红色区域
//基于 HSV 颜色空间提取红色区域 Mat imageRed = Mat::zeros(image.size(), imageHSV.type()); // 创建一个与原图相同尺寸的空图像 for(int i = 0; i < image.rows; ++i){ for(int j = 0; j < image.cols; ++j){ // 提取当前像素的 HSV 值 Vec3b hsvPixel = imageHSV.at<Vec3b>(i,j); int h = hsvPixel[0]; int s = hsvPixel[1]; int v = hsvPixel[2]; if ((h <= 10 || (h >= 156 && h <= 180)) && s >= 43 && s <= 255 && v >= 46 && v <= 255) { imageRed.at<Vec3b>(i,j) = image.at<Vec3b>(i,j); // 保留红色区域 } else { imageRed.at<Vec3b>(i,j) = Vec3b(0, 0, 0); // 将其他区域设为黑色 } }
- 找出轮廓并绘制
后查阅//找出轮廓并绘制轮廓线 Mat imageCountour=Mat::zeros(image.size(), image.type()); for(int i=0;i<image.rows;++i){ for(int j=0;j<image.cols;++j){ if(imageRed.at<Vec3b>(i,j)==Vec3b(0,0,0) && imageRed.at<Vec3b>(i,j+1)!=Vec3b(0,0,0)) imageCountour.at<Vec3b>(i,j)=Vec3b(0,0,0);//若上一个像素是黑的而下一个不是,那么上一个像素即为外轮廓的一部分 else if(imageRed.at<Vec3b>(i,j)!=Vec3b(0,0,0) && imageRed.at<Vec3b>(i,j+1)==Vec3b(0,0,0)) imageCountour.at<Vec3b>(i,j+1)=Vec3b(0,0,0);//若下一个像素是黑的而上一个不是,那么下一个像素即为外轮廓的一部分 else imageCountour.at<Vec3b>(i,j)=Vec3b(255,255,255); } }
OpenCV 中有相应的函数能完成以上操作,于是将代码改为 main 中现在的样子。
- 图像绘制
- 对图像进行处理