我已经坚持这个问题几天了,你是我最后的希望,stackoverflow!
Windows 7,Visual Studio Ultimate 2012,OpenCV 2.4.8。
来源:
int main(){
cv::VideoCapture capture(0);
if(!capture.isOpened()){
printf("Capture failure\n");
return -1;
}
cv::Mat frame;
capture >> frame;
if(frame.empty()) return -1;
cv::namedWindow("Video");
cv::namedWindow("Contour");
while(true){
capture >> frame;
if(frame.empty()) break;
cv::Mat cont = frame;
cv::vector<cv::Vec4i> hierarchy;
cv::vector<cv::vector<cv::Point> > contours;
cv::threshold(cont, cont, 128, 255, cv::THRESH_BINARY);
cv::inRange(cont, cv::Scalar(128, 128, 128), cv::Scalar(255, 255, 255), cont);
cv::findContours(cont, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
for(size_t i=0; i<contours.size(); i++){
cv::drawContours(frame, contours, i, cv::Scalar(0,255,255), 10);
}
cv::imshow("Contour", cont);
cv::imshow("Video", frame);
if(cv::waitKey(10)==27 ) break;
}
cv::destroyAllWindows();
return 0;
}
相当简单的代码,对吧?如果不明显,我想要做的就是应用cv::inRange
从我的网络摄像头获取所有轮廓。那就是它。
此代码为我提供了cv::Exception at memory location 0x0045F7CC
。
修改:还从命令行给我OpenCV Error: Unsupported format or combination of formats ([Start]FindContours supported only 8uC1 and 32sC1 images) in cvStartFindContours, file ........\opencv\modules\imgproc\src\contours.cpp
。
我已经看过使用cv::findContours()
的示例,并且所有这些示例都显示您需要我从cv::Mat
或cv::threshold()
获得的二进制文件cv::inRange()
,但它仍然可以使用{{1}} #39;为我工作。救命啊!
答案 0 :(得分:3)
我解决了!这是代码:
while(true){
capture >> frame;
if(frame.empty()) break;
cv::Mat cont, threshold;
cont = frame.clone();
cv::cvtColor(cont, cont, cv::COLOR_BGR2GRAY);
cv::vector<cv::Vec4i> hierarchy;
cv::vector<cv::vector<cv::Point> > contours;
cv::threshold(cont, cont, 128, 255, cv::THRESH_BINARY);
threshold = cont.clone();
cv::findContours(cont, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
for(size_t i=0; i<contours.size(); i++){
cv::drawContours(frame, contours, i, cv::Scalar(0,0,255), 2);
}
cv::imshow("Contour", threshold);
cv::imshow("Video", frame);
if(cv::waitKey(10)==27 ) break;
}