我在C++和OpenCV中使用斑點檢測技術,但我無法在可用格式中提取輪廓信息。從C++中的斑點檢測中提取OpenCV輪廓陣列
目前我所有的輪廓數據都以cv::Point
格式存儲爲數組;不過,我希望提取座標並將它們存儲在一個數組下,以便我可以根據需要操作這些數據。
我的代碼看起來是這樣的:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
#include <iostream>
#define _USE_MATH_DEFINES
#include <math.h>
using namespace cv;
using namespace std;
int main(int argc, const char** argv)
{
cv::Mat src = cv::imread("frame-1.jpg");
if (src.empty())
return -1;
cv::Mat gray;
cv::cvtColor(~src, gray, CV_BGR2GRAY);
cv::threshold(gray, gray, 160, 255, cv::THRESH_BINARY);
// Find all contours
std::vector<std::vector<cv::Point> > contours;
cv::findContours(gray.clone(), contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
// Fill holes in each contour
cv::drawContours(gray, contours, -1, CV_RGB(255, 255, 255), -1);
cout << contours.size();
std::vector<cv::Point> minXY(contours.size()); // Top Left Point of Bounding Box
std::vector<cv::Point> maxXY(contours.size()); // Bottom Right Point of Bounding Box
for (int i = 0; i < contours.size()){
minXY[i] = maxXY[i] = contours[i][0]; // Assumes the contour has at least 1 point
for(int j = 1; j < contours[i].size(); ++j){
if (contours[i][j].x < minXY[i].x){
minXY[i].x = contours[i][j].x;
} else if (contours[i][j].x > maxXY[i].x){
maxXY[i].x = contours[i][j].x;
}
if (contours[i][j].y < minXY[i].y){
minXY[i].y = contours[i][j].y;
} else if (contours[i][j].y > maxXY[i].y){
maxXY[i].y = contours[i][j].y;
}
}
}
namedWindow("MyWindow", CV_WINDOW_AUTOSIZE);
imshow("MyWindow", gray);
waitKey(0);
destroyWindow("MyWindow");
return 0;
}
的contours[2]
結果給出與第三斑點的輪廓座標陣列;不過,我想將這個數組提取到一個普通變量中,所以我可以真正使用它。我假設這意味着某種cv::Point
轉換?
更新:我應該澄清一下,我想要最大斑點的輪廓的座標,以便我可以操縱數據,例如找到最小x點,找到平均x點,找到斑點的質心等。
目前我已經能夠找到所有的輪廓,然後確定最大的斑點,以及確定其輪廓座標。然而,我還沒有找到一種方法來搜索這個數組來找到最小的x值,或者一個只求和x座標的方法。我將最終也想找到發現斑點的形心的最有效的方法
**輪廓[2]吐出的陣列的形式(使用邊界框,力矩,簡單的算術或其它方法):
[100,267]
[101,270]
[102,271]
我想找到一種方法來搜索左列(即所有的x值),以找到最小和最大等我已經嘗試了幾個方法,但沒有讓我接近。當然,這有一個簡單的解決方案。看起來我所有的問題都來源於輪廓數組的形式爲cv :: Point。
這是你想要的,'std :: vector xxx =等值線[2]'? –
herohuyongtao
使用cv :: Point有什麼問題?你可以訪問點座標爲point.x和point.y – Miki
你應該澄清你的「可用」的概念 – Miki