1

私は、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;
}

よろしくお願いします!

4

2 に答える 2

2

UbuntuLinuxでプログラムを正常にコンパイルして実行しました。現在の私の現在のランダム理論はedges、環境で適切に初期化されていないというものです。

cv::imwriteすべての画像に適切な値が含まれているかどうかを確認するために、いくつかまたはcv::imshow(frame、grayFrame、edgesの場合)を挿入します。

于 2012-04-19T11:03:12.770 に答える
1

それで、あなたは失敗を突き止めずにただ続けるつもりですか?それは確かにあなたを噛むために戻ってきます。

私の推測:フレームが実際に読み取られたかどうかを確認するために何もしません。それが何かを台無しにしている、私の推測:存在しない画像にランダムなものを描画する場合。

于 2013-06-20T06:46:28.103 に答える