2016-12-23 11 views
2

私はOpenCVでイメージセグメンテーションのコードを書くことを試みています。画像処理の一環として、私はSobelフィルタを使ってテスト画像のエッジを検出しようとしています。EXC_BAD_ACCESSエラーOpenCV?

両方のdX量dY方向に勾配の大きさを見つけるために、私は、勾配の両方のユークリッド距離を計算しています。しかし、コードを実行すると上記のエラーが発生します。私は上記のエラーは、私が "ACCESS"メモリ上で利用できない場所を試しているときに発生することを知っているが、私はすべて私のコードでMatを定義していると確信しています。

これは私のコードの一部です。

//Blur the raw image to remove noise 
GaussianBlur(src, src, kernel, 2); 

//Run sobel edge detector 
Sobel(src, edgeX, src.depth(), 1, 0); 
Sobel(src, edgeY, src.depth(), 0, 1); 

edge = Mat::zeros(317,554,CV_8UC1); 

for (int r = 0; r < edgeX.rows; r++) 
{ 
    for (int c = 0; c < edgeY.cols; c++) 
    { 
     edge.at<double>(r,c) = sqrt((edgeX.at<double>(r,c)*edgeX.at<double>(r,c)) + (edgeY.at<double>(r,c)*edgeY.at<double>(r,c))); 
    } 
} 

ここ

  • src:RGBテスト画像
  • edgeX量dY
  • edgeとソーベル出力:のdX勾配
  • edgeYとソーベル出力されますユークリッド距離の。私はこれをデバッグするにはどうすればよいedge.at<double>(316,395)

    にアクセスしようとすると

私はこのライン

edge.at<double>(r,c) = sqrt((edgeX.at<double>(r,c)*edgeX.at<double>(r,c)) + (edgeY.at<double>(r,c)*edgeY.at<double>(r,c))); 

でエラーが出ますか? 私は何が間違っていますか?

答えて

1

edgeCV_8UC1のマトリックスであり、これはucharのマトリックスであり、doubleではないことを意味します。

あなたはat<uchar>とそれにアクセスする必要があります。

edge.at<uchar>(r,c) = sqrt((edgeX.at<uchar>(r,c)*edgeX.at<uchar>(r,c)) + (edgeY.at<uchar>(r,c)*edgeY.at<uchar>(r,c))); 

あなたは.at機能を使用せずにも簡単にアクセスすることができますMat_<Tp>を使用してこの種の問題、回避することができます:

Mat1b edge(317,554,uchar(0)); 
for (int r = 0; r < edgeX.rows; r++) { 
    for (int c = 0; c < edgeY.cols; c++) { 
     edge(r,c) = sqrt((edgeX(r,c)*edgeX(r,c)) + (edgeY(r,c)*edgeY(r,c))); 
    } 
} 

この場合、を使用することもできますD;

Sobel(src, edgeX, CV_32F, 1, 0); 
Sobel(src, edgeY, CV_32F, 0, 1); 
Mat edge; 
magnitude(edgeX, edgeY, edge); 

// Convert to CV_8UC1 
edge.convertTo(edge, CV_8UC1); 
+0

ありがとうございました:)それは助け – Vino

+0

はうれしい:あなたのforループ(それはfloatの行列を必要とする)でやっている同様の操作を行い – Miki

関連する問題