表面越光滑的小球,可控制程度越高。比如我设置底盘倾角为 5°,乒乓球在上面可能会保
持静止,而氧化硅小球可能在 1°的时候就会发生运动。如果可控度低,在控制算法上就要
用大量算法解决这个问题。摄像头我采用 1920*1080 分辨率采集图像数据,大概是 30fps。
完成机械机构标准是,小球的底盘尽量不能出现在垂直 Z 轴放向的转动;调节舵机处于中
值附近时底盘上可停留小球使其静止(我会放出串口控制舵机的源码供大家修改参考);底
盘与相机画面尽量平衡(如图)
【程序框图】
【图像算法】
通过 opencv 获取摄像头画面,初始化时设置平板的左上与右下坐标,在之后的处理中即可
排除无相关的环境。
/* 打开摄像头 */
capture = VideoCapture(CV_CAP_DSHOW);
capture.open(cap);
/* 设置摄像头 */
capture.set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));//设置为 MJPG 格式
capture.set(CV_CAP_PROP_FRAME_WIDTH, CAP_WIDTH);//宽度
capture.set(CV_CAP_PROP_FRAME_HEIGHT, CAP_HEIGHT);//高度
capture.set(CV_CAP_PROP_FPS, CAP_FPS);//帧率 帧/秒
capture.set(CV_CAP_PROP_BRIGHTNESS, 1);//亮度
capture.set(CV_CAP_PROP_CONTRAST, 40);//对比度 40
capture.set(CV_CAP_PROP_SATURATION, 50);//饱和度 50
capture.set(CV_CAP_PROP_HUE, 50);//色调 50
capture.set(CV_CAP_PROP_EXPOSURE, -6.5);//曝光
/* 获取可识别范围 */
Mat frame;
capture >> frame;
imshow("Vidio", frame);
cvSetMouseCallback("Vidio", OnMouseCallBack, &frame);
while (tmp2.y == -1) { waitKey(10); }
destroyWindow("Vidio");
broad_position1.x = tmp1.x;
broad_position1.y = tmp1.y;
broad_position2.x = tmp2.x;
broad_position2.y = tmp2.y;
/* 点击鼠标执行 */
void OnMouseCallBack(int event, int x, int y, int flags, void *param)
{
static bool click_flag = false;
if (event == CV_EVENT_LBUTTONDOWN)
{
if (!click_flag)