ページ 11

C++OpenCVでのMat型のポインタ操作

Posted: 2016年10月03日(月) 08:28
by negimo
C++版OpenCVで画像処理を行っています。現在Mat型配列の操作で困っています
<やりたいこと>
connectedComponentsWithStats()関数で画像をラベリングした後、関数出力である
重心情報centroidsのi番目の先頭ポインタとj番目の先頭ポインタを入れ替えたい

コード:

double *param = centroids.ptr<double>(j); //j番目のラベルの重心の先頭ポインタ
centroids.ptr<double>(j)=centroids.ptr<double>(i);
centroids.ptr<double>(i)=param;
これを実行すると
error: lvalue required as left operand of assignment
centroids.ptr(j)=centroids.ptr(i);
というエラーが出てきます。エラーの意味はわかるのですが、
どのような方法をとればポインタの位置を入れ替えるということを実現できるのかということがわかりません
解決にご助力頂けないでしょうか?

Re: C++OpenCVでのMat型のポインタ操作

Posted: 2016年10月03日(月) 10:22
by usao
>ポインタを入れ替えたい

コード:

cv::Mat M = ( cv::Mat_<double>( 2,2 ) << 0,1,2,3 );

double *pRow1 = M.ptr<double>( 0 );
double *pRow2 = M.ptr<double>( 1 );

std::cout << pRow1[0] << ", " << pRow1[1] << std::endl;
std::cout << pRow2[0] << ", " << pRow2[1] << std::endl;
std::cout << std::endl;

std::swap( pRow1, pRow2 );

std::cout << pRow1[0] << ", " << pRow1[1] << std::endl;
std::cout << pRow2[0] << ", " << pRow2[1] << std::endl;
本当にこういうことがやりたいのだろうか
オフトピック
いつのまにかラベリングが提供されるようになったのか

Re: C++OpenCVでのMat型のポインタ操作

Posted: 2016年10月04日(火) 18:06
by negimo
ありがとうございます。
記載されていたプログラムをアレンジしたところやりたいことを実現させることができました。