0

私はPythonで使用するためのC関数を書いています。実行時にセグメンテーション違反が発生し、printf 呼び出しに従って、if 節でスローされます。シェルへの出力は次のとおりです。

row 1, col 0: 1.000000
row:0, -col:0, index:0
-2: 0.000000
else
row:0, -col:1, index:1
-2: 0.000000
else
row:0, -col:2, index:2
-2: 0.000000
else
row:0, -col:3, index:3
-2: 0.000000
else
row:0, -col:4, index:4
-2: 0.000000
else
row:1, -col:0, index:5
-2: 1.000000
Speicherzugriffsfehler (Speicherabzug geschrieben)

(最後の行はセグメンテーション違反を意味します)

Cコードは次のとおりです。

#include <stdio.h>
#include <math.h>

#define pi 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

void hough(const void* img, int imgRowCount, int imgColCount, const void* thetas, int thetaCount, const void* rhos, int rhoCount, void* out)
{

  const double* imgD = (double*) img;
  double* outD = (double*)out;

  const double* thetasD = (double*)thetas;
  const double* rhosD = (double*)rhos;



  printf("row 1, col 0: %f\n", imgD[getIndex(1, 0, imgColCount)]);


  int row, col, thetaInd, rhoInd, index;
  double rhoVal, minDiff, diff, tmp;
  for(row = 0; row<imgRowCount; row++)
  {
      for(col = 0; col<imgColCount; col++)
      {
          printf("row:%d, -col:%d, index:%d\n", row, col, getIndex(row, col, imgColCount));
          tmp = imgD[getIndex(row, col, imgColCount)];
          printf("-2: %f\n", tmp);
          if (tmp>0.0)
          {
              printf("-1");
              for(thetaInd = 0; thetaInd<thetaCount; thetaInd++)
              {
                  rhoVal = col*cos(thetasD[thetaInd]*(pi/180)) + row*sin(thetasD[thetaInd]*(pi/180));
                  minDiff = INFINITY;
                  index = -1;
                  for(rhoInd = 0; rhoInd<rhoCount; rhoInd++)
                  {
                      diff = abs(rhoVal-rhosD[rhoInd]);
                      if(diff<minDiff)
                      {
                          minDiff = diff;
                          index = rhoInd;
                      }
                  }
                  if(index>=0)
                  {
                    printf("1\n");
                    outD[getIndex(index, thetaInd, thetaCount)] += 1;
                  }
              }
          }
          else
          {
            printf("else\n");
          }
      }

  }


}



int getIndex(int row, int col, int maxCol)
{
    return col + row*maxCol;
}

そして最後に使用されているPythonコード:

import numpy as np
import ctypes
from scipy.misc import imread



def makeReady(arr):
  return np.require(arr, dtype=np.double, requirements=["C_CONTIGUOUS"])



def hough(imgBin, thetaRes=1, rhoRes=1):
  if len(imgBin.shape) > 2:
    imgBin = np.mean(imgBin, axis=2)

  if imgBin.max() > 1:
    imgBin /= imgBin.max()

  if ((imgBin!=0) * (imgBin!=1)).sum()>0:
    imgBin = imgBin > (imgBin.max()/2.0)

  nR,nC = imgBin.shape
  theta = np.linspace(-90.0, 90.0, np.ceil(180.0/thetaRes) + 1.0)
  D = np.sqrt((nR - 1)**2 + (nC - 1)**2)
  q = np.ceil(D/rhoRes)
  nrho = 2*q + 1
  rho = np.linspace(-q*rhoRes, q*rhoRes, nrho)
  H = np.zeros((len(rho), len(theta)))


  imgC = makeReady(imgBin)
  thetasC = makeReady(theta)
  rhosC = makeReady(rho)
  outC = makeReady(H)


  lib = ctypes.cdll.LoadLibrary("./hough.so")
  lib.hough(imgC.ctypes.data_as(ctypes.c_void_p), imgC.shape[0], imgC.shape[1], thetasC.ctypes.data_as(ctypes.c_void_p), len(thetasC), rhosC.ctypes.data_as(ctypes.c_void_p),outC.ctypes.data_as(ctypes.c_void_p))



if __name__ == "__main__":
  img = 1 - (imread("lines.jpeg"))>125
  print img.shape
  a = np.zeros((5,5))
  a[1,0] = 5
  hough(a)

私は何を間違っていますか?ありがとうございました

4

2 に答える 2

0

そのエラーを引き起こす可能性があるように見える唯一のことは、配列の範囲外になることです。getIndex(...)内部で関数を使用する[]と、問題が発生する可能性があります。

ただし、コードを読むのが難しい (コメントやコンテキストがない) ため、デバッガー ( などvalgrind) を使用して、エラーの場所に関する情報を提供することをお勧めします。実際、デバッグ シンボル ( gcc および clang) をvalgrind使用してコンパイルすると、エラーが発生した行番号も表示されます。-g -O0

于 2013-10-03T13:59:29.640 に答える