OpenCV图像识别,qt界面开发,c/c++编程语言,软件程序开发,图像视觉定位抓取,相机标...
就拿相机标定来说,有次产线老师傅拿着棋盘格在镜头前晃了半小时,结果标定误差比麻花还扭曲——后来发现是棋盘格打印在A4纸上产生了热胀冷缩,换成陶瓷标定板才搞定。OpenCV图像识别,qt界面开发,c/c++编程语言,软件程序开发,图像视觉定位抓取,相机标定,目标识别,缺陷检测,海康相机控制,sdk二次开发。OpenCV图像识别,qt界面开发,c/c++编程语言,软件程序开发,图像视觉定位抓取,相机标
OpenCV图像识别,qt界面开发,c/c++编程语言,软件程序开发,图像视觉定位抓取,相机标定,目标识别,缺陷检测,海康相机控制,sdk二次开发。
最近在折腾一个工业视觉检测系统,用到了OpenCV和Qt这对黄金搭档。别看现在界面跑得挺溜,调试阶段可是踩过不少坑。就拿相机标定来说,有次产线老师傅拿着棋盘格在镜头前晃了半小时,结果标定误差比麻花还扭曲——后来发现是棋盘格打印在A4纸上产生了热胀冷缩,换成陶瓷标定板才搞定。

老规矩,先上效果图。这是咱们用Qt搭的监控界面,左边实时视频流,右边缺陷检测结果打标:
// 用Qt渲染OpenCV图像的核心代码
QImage Mat2QImage(const cv::Mat& mat) {
if(mat.type() == CV_8UC3) {
return QImage(mat.data, mat.cols, mat.rows,
static_cast<int>(mat.step),
QImage::Format_RGB888).rgbSwapped();
}
// 处理灰度图情况...
}
这段转换代码我敢说每个做视觉开发的都写过,但要注意cv::Mat的生命周期。有次手抖把局部变量的mat传进去,界面直接花屏给你看,吓得产线小哥以为设备中邪了。
海康相机的SDK调用也是个磨人精,他们的回调函数设计得跟迷宫似的。分享个稳定抓图的配置套路:
// 海康SDK取流示例(精简版)
void CameraControl::StartGrab() {
NET_DVR_DEVICEINFO_V40 devInfo;
LONG lUserID = NET_DVR_Login_V40(&devInfo, &m_stLoginInfo);
// 这行参数配置实测有效减少丢帧
NET_DVR_SetSDKLocalCfg(NET_SDK_LOCAL_CFG_MEMORY_PAGE_SIZE, 4096);
NET_DVR_PREVIEWINFO stPreviewInfo = {0};
stPreviewInfo.hPlayWnd = m_hwnd; // 绑定显示窗口句柄
LONG lRealHandle = NET_DVR_RealPlay_V40(lUserID, &stPreviewInfo, nullptr, nullptr);
}
重点注意NETSDKLOCALCFGMEMORYPAGESIZE这个参数,官方文档藏得深,但实测不设这个参数在连续运行8小时后必崩。建议拿到相机先调这个,比拜菩萨管用。

OpenCV图像识别,qt界面开发,c/c++编程语言,软件程序开发,图像视觉定位抓取,相机标定,目标识别,缺陷检测,海康相机控制,sdk二次开发。
说到缺陷检测,最近用了个取巧的办法——在传统算法基础上套个动态阈值:
def detect_defect(img):
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (7,7), 3)
# 动态阈值系数,根据环境光自动调整
dyn_thresh = np.mean(blur) * 0.8
_, thresh = cv2.threshold(blur, dyn_thresh, 255, cv2.THRESH_BINARY_INV)
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
return [c for c in contours if cv2.contourArea(c) > min_area]
这种方案在光照不稳的车间特别实用,比固定阈值能抗。但要注意均值计算别取到缺陷区域,有次产品本身带黑斑,算法直接把正常品判废了,差点被车间主任追杀。

最后给新人提个醒:做视觉项目千万要把相机标定当祖宗供着。分享个OpenCV标定技巧——用circleGrid替代chessboard,标定精度能提升个30%左右,特别是广角镜头的情况。具体参数配置:
cv::Size boardSize(11, 4); // 根据实际标定板修改
vector<cv::Point2f> centers;
bool found = cv::findCirclesGrid(image, boardSize, centers,
CALIB_CB_ASYMMETRIC_GRID | CALIB_CB_CLUSTERING);
标定完记得做重投影误差校验,别相信OpenCV自己算的那个误差值。有次标定完误差显示0.15像素美滋滋,实际用起来定位飘得跟风筝似的——后来发现是镜头畸变模型选错了,鱼眼镜头用了普通模型,这坑踩得酸爽。
开发工具链方面,强烈推荐把QtCreator和VS2022搭配使用,CMake现在对Qt的支持已经很完善了。遇到界面卡顿可以试试QGraphicsView+OpenGL渲染的方案,比直接用QLabel显示视频流流畅得多。
更多推荐
所有评论(0)