0

私は C++ とコーディング全般に比較的慣れていないため、画像を浮動小数点画像に変換しようとしたときに問題が発生しました。データにかなりの影響を与え始めるため、画像のピクセル強度の平均偏差と標準偏差を計算して丸め誤差を排除するために、これを実行しようとしています。私のコードは以下です。

Mat img = imread("Cells2.tif");

cv::namedWindow("stuff", CV_WINDOW_NORMAL);
cv::imshow("stuff",img);
CvMat cvmat = img;
Mat dst = cvCreateImage(cvGetSize(&cvmat),IPL_DEPTH_32F,1);
cvConvertScale(&cvmat,&dst);
cvScale(&dst,&dst,1.0/255);
cvNamedWindow("Test",CV_WINDOW_NORMAL);
cvShowImage("Test",&dst);

そして、私はこのエラーに遭遇しています

OpenCV エラー: 不明な関数の不正な引数 (配列は CvMat または IplImage である必要があります)、ファイル ......\modules\core\src\array.cpp、行 1238

私はいたるところを見てきましたが、誰もが私が上で試みた CvMat に img を変換するように言っていました。上記のコードが示すようにそれを行うと、 OpenCV Error: Bad argument (Unknown array type) in unknown function, file ......\modules\core\src\matrix.cpp line 697 が表示されます

事前にご協力いただきありがとうございます。

4

2 に答える 2

0

これは、C++ OpenCV で平均を計算するための私のコードです。

int NumPixels = img.total();


double avg;
double c;
    for(int y = 0; y <= img.cols; y++)
        for(int x = 0; x <= dst.rows; x++)
        c+=img.at<uchar>(x,y);
        avg = c/NumPixels;

    cout << "Avg Value\n" << 255*avg;

MATLAB の場合、画像を読み込んで Q = mean(img(:)); を取得するだけです。これは 1776.23 を返し、1612.36 を返すために、cv:Scalar z = mean(dst); を使用しました。

于 2013-05-29T18:07:19.460 に答える
0

C インターフェイスの代わりに C++ OpenCV インターフェイスを使用convertToし、関数を使用してデータ型を変換します。

Mat img = imread("Cells2.tif");  
cv::imshow("source",img);
Mat dst;  // destination image

// check if we have RGB or grayscale image
if (img.channels() == 3) {
    // convert 3-channel (RGB) 8-bit uchar image to 32 bit float
    src.convertTo(dst, CV_32FC3);   
}
else if (img.channels() == 1) {
    // convert 1-chanel (grayscale) 8-bit uchar image to 32 bit float
    img1.convertTo(dst, CV_32FC1);
}

// display output, note that to display dst image correctly 
// we have to divide each element of dst by 255 to keep 
// the pixel values in the range [0,1].
cv::imshow("output",dst/255); 
waitKey();

質問の 2 番目の部分 のすべての要素の平均を計算するにはdst

cv::Salar avg_pixel;
double avg;

// note that Scalar is a vector. 
// If your image is RGB, Scalar will contain 3 values, 
// representing color values for each channel.
avg_pixel = cv::mean(dst);

if (dst.channels() == 3) {
    //if 3 channels
    avg = (avg_pixel[0] + avg_pixel[1] + avg_pixel[2]) / 3;  
}
if(dst.channels() == 1) {
    avg = avg_pixel[0];
} 
cout << "average element of m: " << avg << endl; 
于 2013-05-24T19:04:28.760 に答える