《OpenCV》Part9 OpenCV3.1.0 拟合视频/相机获取的光斑
2016-11-29 10:52
253 查看
《OpenCV》Part9 OpenCV3.1.0 拟合视频/相机获取的光斑
根据前几节介绍,做了一个拟合视频/相机中的激光光斑,算法部分还需要自己改进,这边用的还是椭圆拟合与直线划线定位圆心。
目前做的是灰度图像中的定位,直接在原始视频中的定位需要自己改。该代码可以定位晚上的激光光尖位置,可以通过CCD观测北极星位置,对激光器定位校准。
精度可以自己提高,光斑的位置还可以添加重心法来追踪拟合,光尖也可以使用三角形标注来识别光尖位置,也可以使用snake(主动轮廓模型)算法定位追踪,当然还有其他的好的方法,自己改。光斑位置定位在上篇博文中也有介绍,亚像素级,精度上还是可以的。
根据前几节介绍,做了一个拟合视频/相机中的激光光斑,算法部分还需要自己改进,这边用的还是椭圆拟合与直线划线定位圆心。
目前做的是灰度图像中的定位,直接在原始视频中的定位需要自己改。该代码可以定位晚上的激光光尖位置,可以通过CCD观测北极星位置,对激光器定位校准。
精度可以自己提高,光斑的位置还可以添加重心法来追踪拟合,光尖也可以使用三角形标注来识别光尖位置,也可以使用snake(主动轮廓模型)算法定位追踪,当然还有其他的好的方法,自己改。光斑位置定位在上篇博文中也有介绍,亚像素级,精度上还是可以的。
#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/imgcodecs.hpp" #include "opencv2/highgui/highgui.hpp" #include <iostream> using namespace cv; using namespace std; int sliderPos = 70; Mat image, img_src1; void processImage(int, void*); void drawLine(int, void*); void huoghLineFind(); bool pause = false; int main(int argc, char** argv) { VideoCapture capture(0);//"bike.avi" //1//VID_20150617_205323.mp4 //2//VID_20151024_185222.mp4 //const char* filename = "fitline.jpg";//laser6.jpg//fitline.jpg // image = imread(filename, 0); //if (0 == image.isOpened()) //{ // cout << "Couldn't open Video or camera!\n"; // return 0; //} //Create two new windows to show frams namedWindow("Foreground", 0); namedWindow("TargetCapture", 1); //Process each frame to capture targets for (;;) { capture >> img_src1; if (!pause) { waitKey(33); if (capture.isOpened())//endpty { imshow("Foreground", img_src1); } else { return 0; } } //// Create toolbars. HighGUI use. createTrackbar("threshold", "TargetCapture", &sliderPos, 255); //processImage(0, 0); //drawLine(0, 0); ////////////////////////////////ProcessImage(int,void*)////////////////////////////////////////// vector<vector<Point> > contours; Mat gray = img_src1 >= sliderPos; Mat bimage; cvtColor(gray, bimage, CV_BGR2GRAY); findContours(bimage, contours, RETR_LIST, CHAIN_APPROX_NONE);//RETR_LIST //RETR_FLOODFILL Mat cimage = Mat::zeros(bimage.size(), CV_8UC3); for (size_t i = 0; i < contours.size(); i++) { size_t count = contours[i].size(); if (count < 6) continue; Mat pointsf; Mat(contours[i]).convertTo(pointsf, CV_32F); RotatedRect box = fitEllipse(pointsf); if (MAX(box.size.width, box.size.height) > MIN(box.size.width, box.size.height) * 30) continue; drawContours(cimage, contours, (int)i, Scalar::all(255), 1, 8); ellipse(cimage, box, Scalar(0, 0, 255), 1, LINE_AA); ellipse(cimage, box.center, box.size*0.5f, box.angle, 0, 360, Scalar(0, 255, 255), 1, LINE_AA); Point2f vtx[4]; box.points(vtx); for (int j = 0; j < 4; j++) line(cimage, vtx[j], vtx[(j + 1) % 4], Scalar(0, 255, 0), 1, LINE_AA); } if (!cimage.empty()) { imshow("TargetCapture", cimage);//TargetCapture } else { exit(1); } ////////////////////////////////DrawLine(int,void*)//////////////////////////////////////// //namedWindow("drawLine", 2); //vector<vector<Point> > contours; //Mat bimage = img_src1 >= sliderPos; findContours(bimage, contours, RETR_LIST, CHAIN_APPROX_NONE); //Mat cimage = Mat::zeros(bimage.size(), CV_8UC3); for (size_t i = 0; i < contours.size(); i++) { size_t count = contours[i].size(); if (count < 6) continue; Mat pointsf; Mat(contours[i]).convertTo(pointsf, CV_32F); RotatedRect box = fitEllipse(pointsf); if (MAX(box.size.width, box.size.height) > MIN(box.size.width, box.size.height) * 30) continue; Point2f vtx[4]; box.points(vtx); for (int j = 0; j < 4; j++) //int j = 4; line(cimage, (vtx[j] + vtx[(j + 3) % 4]) / 2, (vtx[(j + 1) % 4] + vtx[(j + 2) % 4]) / 2, Scalar(225, 10, 10), 1, LINE_AA); } if (!cimage.empty()) { imshow("TargetCapture", cimage);//drawLine//TargetCapture } else { exit(1); } ////////////////////////////////////////////////////////////////////////// char key = cv::waitKey(50); if (key == 33) { break; } if (key == ' ') pause = !pause; } // Wait for a key stroke; the same function arranges events processing waitKey(); return 0; } // Define trackbar callback functon. This function find contours, // draw it and approximate it by ellipses.
相关文章推荐
- 《OpenCV》Part7 OpenCV3.1.0 获取图片中光斑坐标(未拟合光斑)
- 《OpenCV》Part6 OpenCV3.1.0 用直线拟合图像中的物体
- 《OpenCV》Part4 OpenCV3.1.0 提取视频中的每一帧
- OpenCV笔记(二)实现获取视频并控制视频的播放速度
- 利用opencv进行usb相机的视频捕获
- OpenCV获取MJGP-Streamer视频流处理方法
- OpenCV 获取摄像头并显示摄像头视频
- opencv获取IP摄像头(IP-camera)实时视频流
- opencv视频获取显示代码问题和调试
- Python OpenCV获取视频的方法
- 关于opencv从视频获取单帧图片函数cvQueryFrame
- opencv打开摄像头获取视频程序
- Python OpenCV获取视频
- opencv成长之路2:一段用来获取摄像头视频的代码
- opencv 3 获取摄像头视频
- 利用opencv进行usb相机的视频捕获
- OpenCV 获取笔记本摄像头,新建窗口显示摄像头视频
- OpenCV摄像头视频的获取
- opencv获取摄像头视频并显示
- OpenCV3.1.0的calibrateCamera()函数计算相机内参数