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.*/