在进行双目标定的过程中,我们需要通过双目相机对棋盘格进行不同角度的拍照,然后还需要把拍摄的双目图像进行裁剪,双目相机拍摄的图像如下图所示,整个过程都是在ubuntu下的clion中完成,下面是自己写的一段代码,比较尴尬的是每次只能裁剪一张图,但是实现功能更重要,没有进一步去修改,代码如下:
具体C++代码:
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(){
Mat img = imread("/home/zixiangq/ZED/15.png",-1); //这里需要修改成你自己图片所在的绝对路径
/*
第一个参数是图片的绝对地址
第二个参数表示图片读入的方式(flags可以缺省,缺省时flags=1,表示以彩色图片方式读入图片)
flags>0时表示以彩色方式读入图片
flags=0时表示以灰度图方式读入图片
flags<0时表示以图片的本来的格式读入图片
*/
imshow("双目图像", img); //“123”是显示框的名字
int a = waitKey(10000); //通过整型变量a获取waitKey函数的返回值
cout << a << endl;
/*
waitKey(x) 表示等x毫秒,在这期间如果有按键按下,则返回按键的ascii码,等待结束则会返回-1.
如果x=0,那么无限等待下去,直到有按键按下
!!!另外,在imshow之后如果没有waitKey语句则不会正常显示图像。即imshow不会生效!!!
*/
destroyAllWindows(); //销毁窗口
Rect rect(1280,0,1280,720); //创建一个Rect框,属于cv中的类,四个参数代表x,y,width,height 左上角是(x,y)=(0,0)
Mat image_cut = Mat(img, rect); //从img中按照rect进行切割,此时修改image_cut时image中对应部分也会修改,因此需要copy
Mat image_copy = image_cut.clone(); //clone函数创建新的图片
imshow("裁剪图像",image_copy);
waitKey();
imwrite( "/home/zixiangq/ZED/right15.png", image_copy); //这里也要修改成你想保存的地址
// 保存mat格式的图片成jpg格式,或者png,bmp格式,
return 0;
}
执行程序:
1.显示双目图像,随便点击任何按键,出现你需要裁剪的图像
2.显示你所裁剪的图像
3.再任意点击一个按键,保存裁剪的图像到你所设置的目标地址,然后程序退出。
这样就完成了一幅图像的裁剪,根据自己的情况可以对图像进行任何尺寸的修改,如果有能够进行所以图像的读取和裁剪的方式,希望可以在评论区进行补充,感谢。