代碼和運行結果如下,
不知道為什么imshow那里沒有輸出,除錯時也沒發現什么問題,剛接觸這方面比較小白,希望各位大神指教#include <iostream>
#include <algorithm>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<opencv2\opencv.hpp>
#include<opencv2\xfeatures2d.hpp>
#include<numeric>
#include"math.h"
#include<sstream>
#include "windows.h"
#include "kcftracker.hpp"
//#pragma comment(lib, "opencv_world310d.lib")
using namespace std;
using namespace cv;
using namespace xfeatures2d;
int main(int argc, char* argv[]) {
//if (argc > 5) return -1;
bool HOG = true;
bool FIXEDWINDOW = false;
bool MULTISCALE = true;
bool SILENT = true;
bool LAB = false;
//for (int i = 0; i < argc; i++) {
// if (strcmp(argv[i], "hog") == 0)
// HOG = true;
// if (strcmp(argv[i], "fixed_window") == 0)
// FIXEDWINDOW = true;
// if (strcmp(argv[i], "singlescale") == 0)
// MULTISCALE = false;
// if (strcmp(argv[i], "show") == 0)
// SILENT = false;
// if (strcmp(argv[i], "lab") == 0) {
// LAB = true;
// HOG = true;
// }
// if (strcmp(argv[i], "gray") == 0)
// HOG = false;
//}
// Create KCFTracker object
KCFTracker tracker(HOG, FIXEDWINDOW, MULTISCALE, LAB);
// set input video
std::string video = "E:/shiyan.mp4";//"E://data//trackingData//tracking_clip.mp4";// "E://dudek.webm";//argv[1];
VideoCapture cap(video); //打開視頻檔案
Mat frame;
Mat src1, src2, dst;
// get bounding box
cap >> frame; //讀取視頻的第一幀
Mat src11 = imread("D:/tupian1.jpg", IMREAD_REDUCED_COLOR_4);
Mat src21 = frame;
cvtColor(src11, src1, CV_BGR2GRAY);
cvtColor(src21, src2, CV_BGR2GRAY);
clock_t start, finish;
double totaltime;
start = clock();
Ptr<SIFT> orb = SIFT::create(); //設定影像配準演算法
//begin
vector<KeyPoint> keypoints1, keypoints2;
Mat descriptors1, descriptors2;
orb->detectAndCompute(src1, Mat(), keypoints1, descriptors1);
orb->detectAndCompute(src2, Mat(), keypoints2, descriptors2);
BFMatcher matcher;//設定相似性評估引數
vector<DMatch> matches1;
matcher.match(descriptors1, descriptors2, matches1);
sort(matches1.begin(), matches1.end());
vector<int> queryIdxs(matches1.size()), trainIdxs(matches1.size());
for (size_t i = 0; i < matches1.size(); i++)
{
queryIdxs[i] = matches1[i].queryIdx;
trainIdxs[i] = matches1[i].trainIdx;
}
Mat H12; //變換矩陣
vector<Point2f> points1; KeyPoint::convert(keypoints1, points1, queryIdxs);
vector<Point2f> points2; KeyPoint::convert(keypoints2, points2, trainIdxs);
float ransacReprojThreshold = 3; //拒絕閾值
H12 = findHomography(Mat(points1), Mat(points2), RHO, 3);//設定去除誤匹配演算法(RANSAC/PROSAC(RHO))
/*cout << "\n此程式的運行時間為" <<H12 << endl;*/
vector<char> matchesMask(matches1.size(), 0);
Mat points1t;
perspectiveTransform(Mat(points1), points1t, H12); //透射變換
for (size_t i = 0; i < points1.size(); i++) //保存‘內點’
{
if (norm(points2[i] - points1t.at<Point2f>((int)i, 0)) < ransacReprojThreshold) //給內點做標記
{
matchesMask[i] = 1;
}
}
//drawMatches(src1, keypoints1, src2, keypoints2, matches1, match_img2, Scalar::all(-1), Scalar::all(-1), matchesMask);
vector <KeyPoint> RR_KP1, RR_KP2;
vector<DMatch> RR_matches;
int mask_sum = 0;
double sumloss = 0;
for (size_t i = 0; i < matches1.size(); i++)
{
if (matchesMask[i] != 0)
{
sumloss += norm(points2[i] - points1t.at<Point2f>((int)i, 0));
mask_sum++;
}
}
sumloss = sumloss / (mask_sum - 1);
//cout << "rmse=" << sumloss << endl;
waitKey(0);
int count = 0;
for (size_t i = 0; i < matchesMask.size(); i++)
{
if (matchesMask[i] == 1)
{
count++;
}
}
//cout << "去除誤配點后匹配點數" << count << endl;
std::vector<Point2f> obj_corners(4);
obj_corners[0] = cvPoint(0, 0);
obj_corners[1] = cvPoint(src1.cols, 0);
obj_corners[2] = cvPoint(src1.cols, src1.rows);
obj_corners[3] = cvPoint(0, src1.rows);
std::vector<Point2f> scene_corners(4);
perspectiveTransform(obj_corners, scene_corners, H12); //通過透射變換尋找物體
line(src21, scene_corners[0], scene_corners[1], Scalar(0, 0, 255), 2);
line(src21, scene_corners[1], scene_corners[2], Scalar(0, 0, 255), 2);
line(src21, scene_corners[2], scene_corners[3], Scalar(0, 0, 255), 2);
line(src21, scene_corners[3], scene_corners[0], Scalar(0, 0, 255), 2);
finish = clock();
totaltime = (double)(finish - start) / CLOCKS_PER_SEC;
//cout << "\n此程式的運行時間為" << totaltime << "秒!" << endl;
//cout << "初配準點數" << size(matches1) << endl;
imwrite("D:\\shengchengtu1.jpg", src21);
//imshow("src", src21);
waitKey(0);
return 0;
Mat Roi=imread("D:\\shengchengtu1.jpg");
double width = scene_corners[2].x - scene_corners[1].x;
double highth = scene_corners[1].y - scene_corners[0].y;
Rect trackWindow(scene_corners[1].x, scene_corners[1].y, width, highth);
//quit if ROI was not selected
//if (roi.width == 0 || roi.height == 0)
//return 0;
//printf("x = %f, y = %f, width = %f, height = %f;\n",roi.x,roi.y,roi.width,roi.height);/////輸出長寬 從上往下框 從下往上框 區別
tracker.init(trackWindow, frame); //初始化tracker
rectangle(frame, trackWindow, Scalar(0, 255, 255), 1, 8);//畫出感興趣區域
imshow("Image", frame);
Rect result;
// do the tracking
printf("Start the tracking process, press ESC to quit.\n");
while (1) //不斷地輸入視頻的每一幀
{
// get frame from the video
cap >> frame;
// stop the program if no more images
if (frame.rows == 0 || frame.cols == 0)
break;
result = tracker.update(frame); //在對輸入的一幀進行tracker以后的結果
rectangle(frame, Point(result.x, result.y), Point(result.x + result.width, result.y + result.height), Scalar(0, 255, 255), 1, 8);//并在當前幀上顯示
imshow("Image", frame);
//quit on ESC button
if (waitKey(1) == 27)break;
}
waitKey(0);
return 0;
}
uj5u.com熱心網友回復:
沒人啊o人帶我去打
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/137756.html
標籤:工具平臺和程序庫
上一篇:求幫,入手
