2016-10-30 6 views
1

次のコードは画像をロードし、一定の値で塗りつぶしてもう一度保存すると想定されています。 もちろん、目的はまだありませんが、それでも機能しません。 ループ内のピクセル値を読み取ることはできますが、すべての変更が無効で、ロードされたときにファイルが保存されます。 は、私は正確にここでは、「効率的な方法を」続い考える:予想通りcvtColorようhttp://docs.opencv.org/2.4/doc/tutorials/core/how_to_scan_images/how_to_scan_images.htmlcv :: MATのピクセルを操作するだけで効果がありません

int main() 
{ 
    Mat im = imread("C:\\folder\\input.jpg"); 

    int channels = im.channels(); 
    int pixels = im.cols * channels; 

    if (!im.isContinuous()) 
    { return 0; } // Just to show that I've thought of that. It never exits here. 


    uchar* f = im.ptr<uchar>(0); 

    for (int i = 0; i < pixels; i++) 
    { 
     f[i] = (uchar)100; 
    } 

    imwrite("C:\\folder\\output.jpg", im); 

    return 0; 
} 

ノーマルCV関数は()効果を取っています。 配列の変更はバッファ上で何らかの形で起こっていますか?

大変ありがとうございます!

答えて

1

問題は、画像のすべてのピクセルを見ていないことです。あなたのコードは、画像のサイズ(im.cols*im.rows*im.channels())に比べて比較的小さい数字のim.cols*im.channels()しか見ません。ポインタを使用してforループで使用すると、イメージ内の2行の値を設定するだけです(保存されたイメージにこれらのセットがあることがわかります)。

以下

が修正されたコードです:

int main() 
{ 
    Mat im = imread("C:\\folder\\input.jpg"); 

    int channels = im.channels(); 
    int pixels = im.cols * im.rows * channels; 

    if (!im.isContinuous()) 
    { return 0; } // Just to show that I've thought of that. It never exits here. 


    uchar* f = im.ptr<uchar>(0); 

    for (int i = 0; i < pixels; i++) 
    { 
     f[i] = (uchar)100; 
    } 

    imwrite("C:\\folder\\output.jpg", im); 

    return 0; 
} 
+0

Hmpfは、私を信じまたはない、私はまさにそれで自分の質問に答えるためにちょうど約ました。.. Damnit、まだちょうど支払われていないたため、mutliple時間を費やしています適切な時に注意... ありがとう! – DragonGamer

+0

心配はいりません!それは誰にも起こります。私はまた、3行目を見るまで、すべてのコードが正しいと思っているあなたのコードをいつか見ていました。 – masad

関連する問題