c++で画像のshape(256, 256, 3)をinput用に(1, 3, 256, 256)に変換したいです。
このサイトを参考にしたのですが上手くいきません。どこが原因か解決策を教えていただけないでしょうか?
よろしくお願いします。
試したC++コード
cpp
1#define W 256 2#define H 256 3void image_info(cv::Mat image){ 4 double min, max; 5 std::cout << "row: " << image.rows << "col " << image.cols << ", channels " << image.channels() << std::endl; 6 cv::minMaxLoc(image, &min, &max); 7 std::cout << "min: " << min << std::endl; 8 std::cout << "max: " << max << std::endl; 9} 10 11float hwc2chw(cv::Mat image){ 12 static const int channels= 3; 13 float total= H * W * channels; 14 float* hostInputBuffer= static_cast<float*>(total); 15 cv::Mat chw_image(H, W, CV_8UC3); 16 17 //Convert HWC to CHW 18 for (int c= 0; c < channels; ++c) 19 { 20 for (int h= 0; h < H; ++h) 21 { 22 for (int w= 0; w < W; ++w) 23 { 24 std::cout << "C: " << c << " H: " << h << " W: " << w << std::endl; 25 Vec3f bgrPixel= chw_image.at<Vec3f>(h, w); 26 int dstIdx= c * H * W + h * W + w; 27 hostInputBuffer[dstIdx]= bgrPixel[c]; 28 } 29 } 30 } 31 //chw_image.copy(output); 32 return hostInputBuffer; 33} 34 35cv::Mat normalization(std::string imageFilepath){ 36 cv::Mat chw_image; 37 cv::Mat image = cv::imread(imageFilepath); 38 cv::resize(image, image, cv::Size(H, W), cv::InterpolationFlags::INTER_CUBIC); 39 cv::cvtColor(image, image, cv::ColorConversionCodes::COLOR_BGR2RGB); 40 float hostInputBuffer = hwc2chw(image); 41 hostInputBuffer.convertTo(chw_image, CV_32FC3, 1.0/127.5, -1); 42 image_info(chw_image); 43 cv::dnn::blobFromImage(chw_image, chw_image); 44 return chw_image; 45}
エラー
/mnt/src/inference.cpp: In function ‘float hwc2chw(cv::Mat)’: /mnt/src/inference.cpp:43:54: error: invalid static_cast from type ‘float’ to type ‘float*’ float* hostInputBuffer= static_cast<float*>(total); ^ /mnt/src/inference.cpp:61:12: error: cannot convert ‘float*’ to ‘float’ in return return hostInputBuffer; ^~~~~~~~~~~~~~~ /mnt/src/inference.cpp: In function ‘cv::Mat normalization(std::string)’: /mnt/src/inference.cpp:70:21: error: request for member ‘convertTo’ in ‘hostInputBuffer’, which is of non-class type ‘float’ hostInputBuffer.convertTo(chw_image, CV_32FC3, 1.0/127.5, -1); ^~~~~~~~~ src/CMakeFiles/inference.dir/build.make:65: recipe for target 'src/CMakeFiles/inference.dir/inference.cpp.o' failed make[2]: *** [src/CMakeFiles/inference.dir/inference.cpp.o] Error 1 CMakeFiles/Makefile2:96: recipe for target 'src/CMakeFiles/inference.dir/all' failed make[1]: *** [src/CMakeFiles/inference.dir/all] Error 2 Makefile:86: recipe for target 'all' failed make: *** [all] Error 2
そもそも,
> 画像のshape
という語は,世間一般に通用する物なのですか?
言い換えれば,(256, 256, 3) とか (1, 3, 256, 256) とだけ言えば,それで伝わる物ですか?
この2つの間で既に数値の個数が異なっているのですが,
---
"画像のshape" という場合には,
「数値が3個の場合には1番目の数値は××で2番目の数値は▲▲で…」
「数値が4個の場合には…(略)」
---
みたいな定義がどこかに存在するのでしょうか?
そうであれば,それを示していただきたいのですが.
> このサイトを参考にしたのですが上手くいきません
リンク先を見ると,
segmentation fault (core dumped)
とかいうことになるコードである様子ですが,そんなのを参考にしてて大丈夫なんですか?
それはそれとして,OpenCVの話ならば,質問に OpenCVのタグ をつけた方が良い(CVを使っている人に見られやすくなる)かと.
回答3件
あなたの回答
tips
プレビュー