Ich möchte den Schwerpunkt jeder Kontur finden.für das nehme ich einige Beispielcode und teste es..ich habe ein Problem mit dieser Codierung.Ich habe einen Fehler .. .Bitte helfen mir, dass ... diese sehr nützlich für mich ... Vielen Dank im Voraus zu lösen ... ich benutze Windows-Plattform mit Visual Studio 2008Ich habe prob mit dieser Codierung verwandt, um die Konturen zu finden
#include <cv.h>
#include <highgui.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace cv;
using namespace std;
Mat src;
Mat src_gray;
int thresh = 100;
int max_thresh = 255;
RNG rng(12345);
/// Function header
void thresh_callback(int, void*);
/** @function main */
int main(int argc, char** argv)
{
/// Load source image and convert it to gray
IplImage* src = cvLoadImage("TEST2.jpg");
/// Convert image to gray and blur it
cvtColor(src, src_gray, CV_BGR2GRAY);
blur(src_gray, src_gray, Size(3,3));
/// Create Window
char* source_window = "Source";
namedWindow(source_window, CV_WINDOW_AUTOSIZE);
imshow(source_window, src);
createTrackbar("Canny thresh:","Source", &thresh, max_thresh, thresh_callback);
thresh_callback(0,0);
waitKey(0);
return(0);
}
/** @function thresh_callback */
void thresh_callback(int, void*)
{
Mat canny_output;
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
/// Detect edges using canny
Canny(src_gray, canny_output, thresh,thresh*2,3);
/// Find contours
findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
/// Get the moments
vector<Moments> mu(contours.size());
for(int i = 0; i < contours.size(); i++)
{
mu[i] = moments(contours[i], false);
}
/// Get the mass centers:
vector<Point2f> mc(contours.size());
for(int i = 0; i < contours.size(); i++)
{
mc[i] = Point2f(mu[i].m10/mu[i].m00 , mu[i].m01/mu[i].m00);
}
/// Draw contours
Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3);
for(int i = 0; i< contours.size(); i++)
{
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255));
drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
circle(drawing, mc[i], 4, color, -1, 8, 0);
}
/// Show in a window
namedWindow("Contours", CV_WINDOW_AUTOSIZE);
imshow("Contours", drawing);
/// Calculate the area with the moments 00 and compare with the result of the OpenCV function
printf("\t Info: Area and Contour Length \n");
for(int i = 0; i< contours.size(); i++)
{
printf(" * Contour[%d] - Area (M_00) = %.2f - Area OpenCV: %.2f - Length: %.2f \n", i, mu[i].m00, contourArea(contours[i]), arcLength(contours[i], true));
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255));
drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
circle(drawing, mc[i], 4, color, -1, 8, 0);
}
}
Der Fehler lik ...
Error 2 error C2664: 'cv::moments' : cannot convert parameter 1 from 'std::vector<_Ty>' to 'const cv::Mat &' d:\aranga_try\new_opencv\new_opencv\auto_focustest.cpp 57 New_opencv
Error 8 error C2664: 'cv::contourArea' : cannot convert parameter 1 from 'std::vector<_Ty>' to 'const cv::Mat &' d:\aranga_try\new_opencv\new_opencv\auto_focustest.cpp 84 New_opencv
Error 9 error C2664: 'cv::arcLength' : cannot convert parameter 1 from 'std::vector<_Ty>' to 'const cv::Mat &' d:\aranga_try\new_opencv\new_opencv\auto_focustest.cpp 84 New_opencv
Welche Version von OpenCV verwenden Sie? Nachdem ich 'IplImage * src = cvLoadImage (" TEST2.jpg ") geändert habe;' zu 'Mat src = imread (" TEST2.jpg ");' und 'vector> Konturen;' zu 'Vektor > Konturen; 'Ihr Beispiel kompiliert fehlerfrei mit OpenCV 2.3.1. –
sietschie
Ich benutze OpenCV 2.1.0 .... Aber ich habe den gleichen Fehler nach der Korrektur auch ... – aranga