2017-08-18 15 views
-2

で使用中に、cv::Matピクセルをfloat4*にマップしてCUDA計算を試みています。OpenCVセグメンテーションフォールト(コアダンプ)CvDA :: Mat ::を

cv::Mat frame = cv::imread("peds-007.png", cv::IMREAD_COLOR); 

cudaAllocMapped((void**) cpu, (void**) gpu, 
       frame.cols * frame.rows * sizeof(float) * 4); 

float4* cpuPtr = *cpu; 
for (uint32_t y = 0; y < frame.rows; y++) { 
    for (uint32_t x = 0; x < frame.cols; x++) { 
     std::cout << x << ", " << y << std::endl; 
     const float4 px = make_float4(float(frame.at<cv::Vec3b>(x, y)[2]), 
             float(frame.at<cv::Vec3b>(x, y)[1]), 
             float(frame.at<cv::Vec3b>(x, y)[0]), 
             float(255)); 
             //float(frame.at<cv::Vec4b>(x, y)[3]));   
     cpuPtr[y*imgWidth+x] = px; 
    } 
} 

上記のコードを実行すると、Segmentation fault (core dumped)が返されます。

コードによってアクセスされる最後のピクセルは(1662,0)にあります。

私が直接、ループの外のピクセルにアクセスする場合:

frame.at<cv::Vec3b>(1662, 0); 

またSegmentation fault (core dumped)の原因となります。

なぜこの問題が発生し、この問題を解決するにはどうすればよいですか?

+1

「fr」とは何ですか?この条件は無効です: 'x

+0

@MarekRああ、はい。 typo ...ありがとう! –

+0

画像の解像度は? – BHawk

答えて

1

cv :: Matは行優先順位でインデックスされます。あなたのxとyを逆にする。

const float4 px = make_float4(float(frame.at<cv::Vec3b>(y,x)[2]), 
           float(frame.at<cv::Vec3b>(y,x)[1]), 
           float(frame.at<cv::Vec3b>(y,x)[0]), 
           float(255)); 
+0

ああ... 'y'はすでに行インデックスです... –

+0

これは奇妙なことを知っています...私はちょうどイメージがうまく読み込まれなかったかもしれないと思ったので、私は' Mat'を私の目を通して見るために 'imshow'を試みましたか?その後、それは動作します... 'imshow'の後、それは動作します...奇妙な... –

+0

私はyが行インデックスであることを知っています。 frame.atの呼び出しでインデックスが逆転しています。それはy、xであるはずです。それを試してみてください。それが動作することを確認します。これを答えとし、霧の中を一次移動してください! –

関連する問題