2017-03-04 17 views
0

Iがスロー処理された画像を有している:私は(白と黒の点の数量を計算する)線にbelowsのそのを分析するよりOpenCVのマット画像データ構造

//UIImage to Mat 
cv::Mat originalMat = [self cvMatFromUIImage:inputImage]; 

//Grayscale 
cv::Mat grayMat; 
cv::cvtColor(originalMat, grayMat, CV_RGB2GRAY); 

//Blur 
cv::Mat gaussMat; 
cv::GaussianBlur(grayMat , gaussMat, cv::Size(9, 9), 2, 2); 

//Threshold 
cv::threshold(grayMat,tMat,100,255,cv::THRESH_BINARY); 

。たとえば、画像が100x120pxで、ラインをチェックしたい場合は、x = 5y = from 0 to 119です。逆の場合はx = 0..99; y = 5となります。

だから、Matにはx - Mat.colsy - Mat.rowsが含まれていますが、別の方法でデータが保存されているようです。例えば私はラインにbelowsのピクセルの色を変更しようとしたが、2行取得できませんでした:白画像用の

for(int x = 0; x < tMat.cols; x++){ 
    tMat.at<cv::Vec4b>(5,x)[0] = 100; 
} 

for(int y = 0; y < tMat.rows; y++){ 
    tMat.at<cv::Vec4b>(y,5)[0] = 100; 
} 
return [self UIImageFromCVMat:tMat]; 

結果を:

enter image description here

私は2を取得しdid't理由ライン? Matに\ check行を直接描画することはできますか? y = kx + bで計算した行をチェックするとどうなりますか?

答えて

3

誤った方法でピクセル値にアクセスしています。あなたが唯一のチャンネルを持っているイメージで作業している、それはあなたがこのようにピクセル値にアクセスする必要がある理由です:

for (int x = 0; x < tMat.cols; x++){ 
    tMat.at<unsigned char>(5, x) = 100; 
} 

for (int y = 0; y < tMat.rows; y++){ 
    tMat.at<unsigned char>(y, 5) = 100; 
} 

マット要素のタイプは、二つの特性によって定義される - チャンネルの数との基礎となりますデータのタイプ。これらの用語の意味がわからない場合は、cv::Mat::type()cv::Mat::channels()cv::Mat::depth()のマニュアルを読むことを強くお勧めします。

さらに二つの例:

mat.at<float>(x, y) = 1.0f; // if mat type is CV_32FC1 
mat.at<cv::Vec3b>(x, y) = Vec3b(1, 2, 3); // if mat type is CV_8UC3 
2

おそらくあなたのMatデータタイプに問題があります。しきい値の出力は、8ビットまたは32ビット(http://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html?highlight=threshold#threshold)の単一チャネルイメージであるため、値をMat.at<Vec4b>[0]で設定しないでください。

ここでは、マトリックスのタイプを返す関数です。使用方法はコメントアウトされた部分にあります。 How to find out what type of a Mat object is with Mat::type() in OpenCVからコピーされました。

std::string type2str(int type){ 
//string ty = type2str(comparisonResult.type()); 
//printf("Matrix: %s %dx%d \n", ty.c_str(), comparisonResult.cols, comparisonResult.rows); 

string r; 

uchar depth = type & CV_MAT_DEPTH_MASK; 
uchar chans = 1 + (type >> CV_CN_SHIFT); 

switch (depth) { 
case CV_8U: r = "8U"; break; 
case CV_8S: r = "8S"; break; 
case CV_16U: r = "16U"; break; 
case CV_16S: r = "16S"; break; 
case CV_32S: r = "32S"; break; 
case CV_32F: r = "32F"; break; 
case CV_64F: r = "64F"; break; 
default:  r = "User"; break; 
} 

r += "C"; 
r += (chans+'0'); 

return r;} 
関連する問題