2013-05-18 101 views
1

我剛剛開始使用Open CV庫,我的第一個代碼之一是一個簡單的負轉換函數。opencv圖像窗口/ imshow

#include <stdio.h> 
#include <opencv2/opencv.hpp> 

using namespace cv; 
using namespace std; 

void negative(Mat& input,Mat& output) 
{ 
    int row = input.rows; 
    int col = input.cols; 
    int x,y; 
    uchar *input_data=input.data; 
    uchar *output_data= output.data; 


    for(x=0;x<row;x++) 
    for(y=0;y<col;y++) 
     output_data[x*col+y]=255-input_data[x*col+y]; 

    cout<<x<<y; 



} 

int main(int argc, char** argv) 
{ 
    Mat image; 
    image = imread(argv[1], 1); 

    Mat output=image.clone(); 

    negative(image,output); 

    namedWindow("Display Image", CV_WINDOW_AUTOSIZE); 
    imshow("Display Image", output); 

    waitKey(0); 

    return 0; 
} 

我添加了額外的行來檢查整個圖像是否被處理。我的輸出圖像面臨的問題是,負變換僅應用於圖像的上半部分。

現在發生的事情是,只有後,我按一個鍵x和y的值顯示(即一旦圖像顯示)

我的問題是,爲什麼被執行函數調用之前的窗口?

回答

1

試着寫:

cout << x << y << endl; 

函數之前被調用,但輸出不直接沖刷,從而導致你的圖像寫入文本之前出現。通過添加「endline」,您強制刷新。您也可以使用flush(cout);而不是添加和結束。


爲負,則可以使用OpenCV的功能subtract()直接:

subtract(Scalar(255, 255, 255), input, output); 
+1

是的,也減去作品+1。 –

+0

然而,你可以檢查是否'減法(Vec3b(255,255,255),輸入,輸出)'是否正確?我也認爲就地工作也更有效率。 (輸出可以與輸入相同,不需要克隆。) –

+1

我的錯誤:標量必須具有與圖像一樣多的通道。我編輯它。輸出不一定要被克隆。他只需要實際申報。 – JonesV

2

在你的代碼的根本問題是,你是在讀入彩色圖像,但你嘗試處理它爲灰度。因此,索引轉移,真正發生的是您只處理圖像的前三分之一(由於3通道格式)。

See opencv imread manual

標誌 - 指定加載的圖像的顏色類型:
> 0加載的圖像被強制爲一個3通道的色彩圖像
= 0所加載的圖像被強制爲灰度

您已指定標誌= 1。

下面是做這件事的方式:

Vec3b v(255, 255, 255); 
for(int i=0;i<input.rows;i++) //search for edges 
{ 
    for (int j=0 ;j<input.cols;j++) 
    { 
     output.at<Vec3b>(i,j) = v - input.at<Vec3b>(i,j); 
    } 
} 

注意的是,這裏Vec3b是相對於UCHAR這是一個1路值3通道的像素值。
爲了更高效的實施,你可以看看Mat.ptr<Vec3b>(i)

編輯: 如果您需要處理大量的圖片, 超過像素的最快方法是一般的迭代:

Vec3b v(255, 255, 255); // or maybe Scalar v(255,255,255) Im not sure 
for(int i=0;i<input.rows;i++) //search for edges 
{ 
    Vec3b *p=input.ptr<Vec3b>(i); 
    Vec3b *q=output.ptr<Vec3b>(i); 
    for (int j=0 ;j<input.cols;j++) 
    { 
     q[j] = v - p[j]; 
    } 
} 

看「的OpenCV教程」 - 「的有效途徑」一節。

+0

這很有趣...我回答了另一個問題,因爲「我的問題是......」部分=)。無論如何,你是對的。 – JonesV

+0

@BarnabasSzabolcs,你是一個拯救生命的人:)非常感謝。這個問題已經習慣了由我的部門編寫的一個早期的定製庫(主要用於灰度)。我還寫了其他代碼平均也由於同樣的錯誤再次失敗,也失敗了。我無法將您鏈接到評論謝謝 – Whereismywall

+0

@Whereismywall沒問題。 :)更新了我的答案,詳細介紹了開發一個庫。現在你也可以鏈接了。 –