opencv学习系列:目标检测相关
来源:互联网 发布:黑米抢购软件 编辑:程序博客网 时间:2024/06/05 12:01
***********************************************************************************************************/*1.读取文件夹下的图片生成视频文件*/#include <iostream>#include <string>#include <io.h>#include <opencv2/opencv.hpp>using namespace std;using namespace cv;int main(int argc, char** argv){ // 图片集 string fileFolderPath = "../libo_resource/egtest05"; string fileExtension = "jpg"; string fileFolder = fileFolderPath + "\\*." + fileExtension; // 输出视频 string outputVideoName = "../libo_resource/output2.avi"; // openCV video writer VideoWriter writer; int codec = 0; int frameRate = 25; Size frameSize; // 遍历文件夹 char fileName[1000]; struct _finddata_t fileInfo; // 文件信息结构体 // 1. 第一次查找 long HANDLE = _findfirst(fileFolder.c_str(), &fileInfo);//句柄为文件夹句柄, if (HANDLE == -1) { _findclose(HANDLE); return -1; } // 2. 循环查找 do { sprintf(fileName, "%s\\%s", fileFolderPath.c_str(), fileInfo.name); if (fileInfo.attrib == _A_ARCH) // 是存档类型文件 { Mat frame; frame = imread(fileName); // 读入图片 if (!writer.isOpened()) { frameSize.width = frame.cols; frameSize.height = frame.rows; if (!writer.open(outputVideoName, CV_FOURCC('D', 'I', 'V', 'X'), frameRate, frameSize, true)) { cout << "open writer error..." << endl; return -1; } } // 将图片数据写入 writer.write(frame); // 显示 imshow("video", frame); waitKey(frameRate); } } while (!_findnext(HANDLE, &fileInfo));//条件为真则执行循环!取文件夹下的下一个文件,其名称,改动信息等放入fileInfo结构体中,如果操作失败返回值-1,成功返回0. _findclose(HANDLE); return 0;}***********************************************************************************************************/*2.鼠标获取图像像素位置并显示:*/#include <cv.h> #include <iostream>#include <opencv2/opencv.hpp>using namespace cv;using namespace std;Mat src;void on_mouse(int event, int x, int y, int flags, void* ustc){ if (event == CV_EVENT_LBUTTONDOWN) { Point pt = Point(x, y); char temp[16]; sprintf(temp, "(%d,%d)", pt.x, pt.y); putText(src, temp, pt, FONT_HERSHEY_SIMPLEX,0.5, Scalar(255, 0,255)); circle(src, pt, 2, Scalar(255, 0, 0, 0), CV_FILLED, CV_AA, 0); imshow("src", src); }}int main(){ src = imread("../libo_resource/2.jpg", 1); namedWindow("src", 1); setMouseCallback("src", on_mouse, 0); imshow("src", src); waitKey(0);//不会接受鼠标单击事件而使程序结束,只对按键有效 return 0;}***************************************************************************************3.视频文件放缩到640*480,并用基于SURF的特征配准(配准部分保存文件有问题),保留视频文件*/#include <iostream>#include <string>#include <io.h>#include <opencv2/opencv.hpp>#include <opencv2/nonfree/nonfree.hpp> using namespace std;using namespace cv;void mergeImg(Mat & dst, Mat &src1, Mat &src2){ int rows = src1.rows + 5 + src2.rows; int cols = src1.cols + 5 + src2.cols; CV_Assert(src1.type() == src2.type()); dst.create(rows, cols, src1.type()); src1.copyTo(dst(Rect(0, 0, src1.cols, src1.rows))); src2.copyTo(dst(Rect(src1.cols + 5, 0, src2.cols, src2.rows)));}int main(int argc, char** argv){ // 输入视频 string inputVideoName = "../libo_resource/9.avi"; // 输出视频1:放缩到640*480 string outputVideoName1 = "../libo_output/output9.avi"; // 输出视频2:基于SURF的特征配准,保留视频文件 string outputVideoName2 = "../libo_output/output4.avi"; VideoCapture capture(inputVideoName.c_str()); if (!capture.isOpened()) { return -1; } VideoWriter writer; int frameRate = 25; Size frameSize=Size(640,480);//或用放缩倍数://放缩倍数double scale = 0.4;//设置缩放后的图片的尺寸Size frameSize = Size(image1.cols*scale, image1.rows*scale); if (!writer.open(outputVideoName1, CV_FOURCC('D', 'I', 'V', 'X'), frameRate, frameSize, true)) { cout << "open writer error..." << endl; return -1; } Mat image1, image2; while (true) { capture >> image1; if (image1.empty()) { break; } Mat ResImg = Mat(frameSize, image1.type()); /* 差值方法: CV_INTER_NN - 最近邻差值 CV_INTER_LINEAR - 双线性差值 (缺省使用) CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法 CV_INTER_CUBIC - 立方差值 */ resize(image1, ResImg, frameSize, CV_INTER_CUBIC); //创建窗口用于显示缩放后的图像 cvNamedWindow("放缩后的图像", CV_WINDOW_AUTOSIZE); imshow("放缩后的图像", ResImg); // 将这帧图片数据写入 输出视频1:放缩到特定尺寸 writer.write(ResImg); waitKey(frameRate); } capture.release(); writer.release(); cout << "完成放缩后的视频保存" << endl; waitKey(0); //cout << "按任意键对之前刚保存的视频继续进行基于SURF特征的配准处理,保留处理的视频文件" << endl; //***************************************************************************************************** /* VideoCapture capture2(outputVideoName1.c_str()); if (!capture2.isOpened()) { return -1; } VideoWriter writer2; frameRate = 10; if (!writer2.open(outputVideoName2, CV_FOURCC('D', 'I', 'V', 'X'), frameRate, frameSize, true)) { cout << "open writer error..." << endl; return -1; } Mat image01, image02, imgdiff; while (true) { //隔两帧配准 capture2 >> image01; if (image01.empty()) { break; } capture2 >> image02; //capture2 >> image02; if (image02.empty()) { break; } //GaussianBlur(image02, image02, Size(3,3), 0); double time0 = static_cast<double>(getTickCount());//开始计时 //灰度图转换 Mat image11, image22; cvtColor(image01, image11, CV_RGB2GRAY); cvtColor(image02, image22, CV_RGB2GRAY); //提取特征点 SurfFeatureDetector surfDetector(500); // 海塞矩阵阈值,高一点速度会快些 vector<KeyPoint> keyPoint1, keyPoint2; surfDetector.detect(image11, keyPoint1); surfDetector.detect(image22, keyPoint2); //特征点描述,为下边的特征点匹配做准备 SurfDescriptorExtractor SurfDescriptor; Mat imageDesc1, imageDesc2; SurfDescriptor.compute(image11, keyPoint1, imageDesc1); SurfDescriptor.compute(image22, keyPoint2, imageDesc2); //获得匹配特征点,并提取最优配对 FlannBasedMatcher matcher; vector<DMatch> matchePoints; matcher.match(imageDesc1, imageDesc2, matchePoints, Mat()); sort(matchePoints.begin(), matchePoints.end()); //特征点排序 //获取排在前N个的最优匹配特征点 vector<Point2f> imagePoints1, imagePoints2; for (int i = 0; i < (int)(matchePoints.size()*0.25); i++) { imagePoints1.push_back(keyPoint1[matchePoints[i].queryIdx].pt); imagePoints2.push_back(keyPoint2[matchePoints[i].trainIdx].pt); } //获取图像1到图像2的投影映射矩阵 尺寸为3*3 Mat homo = findHomography(imagePoints1, imagePoints2, CV_RANSAC); //cout<<"变换矩阵为:\n"<<homo<<endl<<endl; //输出映射矩阵 //图像配准 Mat imageTransform1, imgpeizhun, imgerzhi, comp; warpPerspective(image01, imageTransform1, homo, Size(image02.cols, image02.rows)); //保存处理后的效果视频 writer2.write(imageTransform1); //将前一帧变换变换后的结果和第三帧比较 mergeImg(comp, image02, imageTransform1); imshow("后一帧配准前后比较", comp); //show("经过透视矩阵变换后",imageTransform1); //absdiff(image02, imageTransform1, imgpeizhun); //imshow("配准帧差", imgpeizhun); //threshold(imgpeizhun, imgerzhi, 50, 255.0, CV_THRESH_BINARY); //imshow("配准二值化", imgerzhi); //输出所需时间 time0 = ((double)getTickCount() - time0) / getTickFrequency(); cout << "配准一次的时间为:" << time0 << endl; waitKey(5); } capture2.release(); writer2.release(); cout << "完成配准处理后的视频保存" << endl; */ waitKey(0); cout << "按任意键退出" << endl; return 0;}*******************************************************************************************/*4.传统的选取最优匹配点进行匹配*/vector<DMatch> matchePoints;matcher.match(imageDesc1, imageDesc2, matchePoints, Mat());double max_dist = 0; double min_dist = 150;// 特征点最大最小距离for (int i = 0; i < imageDesc1.rows; i++) {double dist = matchePoints[i].distance;if (dist < min_dist) min_dist = dist;if (dist > max_dist) max_dist = dist;}// 输出printf("> 最大距离(Max dist) : %f \n", max_dist);printf("> 最小距离(Min dist) : %f \n", min_dist);// 筛选std::vector< DMatch > good_matches;for (int i = 0; i < imageDesc1.rows; i++) {if (matchePoints[i].distance < 5 * min_dist) {good_matches.push_back(matchePoints[i]);}}cout << "Good_matches:" << good_matches.size() << endl;*********************************************************************************************/*5.*/
阅读全文
0 0
- opencv学习系列:目标检测相关
- opencv学习系列:目标跟踪相关
- opencv学习---运动目标(前景)检测
- openCV目标检测学习笔记(一)
- OpenCV运动目标检测
- opencv 运动目标检测
- 目标检测 OpenCV
- 【OpenCV】目标检测
- 目标检测相关收集
- CVPR2017-目标检测相关
- 目标检测-RCNN系列
- 目标检测-RCNN系列
- 目标检测: RCNN系列
- opencv学习系列(三)---直线检测
- 光流法-运动目标的检测(opencv学习)
- 光流法-运动目标的检测二(opencv学习)
- 新手学习opencv十一:运动目标(前景)检测
- 深度学习 + OpenCV,Python实现实时目标检测
- database: C and mysql
- 朱啸虎:创业公司不要一开始就想着教育市场
- 链表倒置
- 如何让图片按比例响应式缩放并自动裁剪的css技巧(同时也适用于一些轮播父容器响应式缩放)
- 修改Eclipse格式化代默认长度
- opencv学习系列:目标检测相关
- Python.CVXPY学习指南三
- 记录被计算机虐死的心酸历程之bamm-2.5.0的安装-1
- 2017 Google 开发者大会都有哪些炫酷科技?
- elasticsearch 使用go-mysql-elasticsearch 同步Mysql NDB Cluster 日志格式设置
- 基于Nginx负载均衡方案
- 数据结构实验之排序七:选课名单
- Redis安装
- swift-oc wkwebView使用自定义UIMenuController