私は、OpenCV 2コンピュータービジョンアプリケーションプログラミングクックブックという名前の本から例を実装しようとしました。この本は、ハフ確率アルゴリズム(170ページ)を使用して線を見つける方法を示しています。(非常に良い本です!) pdfの本
しかし、私はC ++でいくつかの問題に遭遇しました。私はプログラミングの第一人者ではないので、あなたの助けが必要です。Visual Studioは、次のエラーを表示します。
LineTracking_v02.exeの0x00e274b7で未処理の例外:0xC0000005:アクセス違反の読み取り場所0x00000000。
デバッグすると、57行目(「findLines」関数の「returnlines;」)から来ているようです。
理由はわかりましたか?
これが私のコードです:
//v2
#include "opencv\cv.h"
#include "opencv\highgui.h"
#include <iostream>
using namespace cv;
using namespace std;
#define PI 3.1415926535898
class LineFinder{
private :
//original image
cv::Mat img;
//vector containing the end points of the detected lines
std::vector<cv::Vec4i> lines;
//accumulator resolution parameters
double deltaRho;
double deltaTheta;
//minimum number of votes that a lines must receive before
//being considered
int minVote;
//min length for a line
double minLength;
//max allowed gap along the line
double maxGap;
public:
//default accumulator resolution is 1 pixel by 1 degree,
//no gap, no minimum length
LineFinder() : deltaRho(1),
deltaTheta(PI/180),
minVote(10),
minLength(0.) {}
//Set the resolution of the accumulator
void setAccResolution(double dRho, double dTheta){
deltaRho = dRho;
deltaTheta = dTheta;
}
//Set the minimum number of votes
void setMinVote(int minv){
minVote = minv;
}
//Set line length and gap
void setLineLengthAndGap(double length, double gap){
minLength = length;
maxGap = gap;
}
//Apply probabilistic Hough Transform
std::vector<cv::Vec4i> findLines(cv::Mat& binary){
lines.clear();
cv::HoughLinesP(binary, lines, deltaRho, deltaTheta, minVote, minLength, maxGap);
return lines;
}
//Draw the detected lines on an image
void drawDetectedLines(cv::Mat &image, cv::Scalar color=cv::Scalar(255,255,255)){
std::vector<cv::Vec4i>::const_iterator it2 = lines.begin();
while(it2!=lines.end()){
cv::Point pt1((*it2)[0], (*it2)[1]);
cv::Point pt2((*it2)[2], (*it2)[3]);
cv::line(image, pt1, pt2, color);
++it2;
}
}
};
int main(int, char**)
{
// Open the default camera
cv::VideoCapture capture(0);
// Check if we succeeded
if(!capture.isOpened())
{
std::cout<<"Video capture failed, please check the camera."<<std::endl;
return -1;
}else{
std::cout<<"Video camera capture successful!"<<std::endl;
}
for(;;) {
cv::Mat frame;
cv::Mat grayFrame;
cv::Mat gaussGrayFrame;
cv::Mat edges;
LineFinder finder;
capture >> frame; // get a new frame from camera
//Convert the frame into a gray Frame
cv::cvtColor(frame, grayFrame, CV_BGR2GRAY);
//Apply a Gaussian Blur on the gray-level Frame
cv::GaussianBlur(grayFrame, gaussGrayFrame, cv::Size(7,7), 1.5, 1.5);
//Apply Canny Algorithm
cv::Canny(
gaussGrayFrame, // gray-level source image
edges, // output contours
0, // low threshold
30, // high threshold
3); // aperture size
//End Canny Algorithm
//Detect lines
std::vector<cv::Vec4i> lines = finder.findLines(edges);
//Draw the detected lines
finder.drawDetectedLines(frame);
cv::imshow("Camera Preview", frame);
if(cv::waitKey(30) >= 0) break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}
よろしくお願いします!