2013-02-09 21 views
0

下午好,OpenCV的2.4.2字節數組墊產生一個奇怪的圖像模式

我想通過一個DLL運行OpenCV並在LabVIEW應用程序中使用它。

我已正確獲取LV中的圖像並將字節數組傳遞給DLL

我可以在文本文件中循環顯示每個像素的值並將它們與LV中的輸出進行匹配,因此我知道我的所有像素都處於正確的位置,因爲LV在開始時,前兩個值保留爲高度和寬度,其餘爲任意數字。但是,這一切應該做的是在圖像的左側產生條紋。

接下來,我使用以下幾行來轉換並顯示圖像。

a[0]a[1] ...等是渠道。

輸出圖像是一個非常水平向外延伸的圖像,像素間隔相等,間距爲15-20像素,周圍是黑色像素。我附上截圖

_declspec (dllexport) double imageProcess(int **a, int &x, int &y, int &cor,int &cog,int &cob,int &cow, int th, int hth) 
{ 

    y = a[0][0]; 
    x = a[0][1]; 


    Mat image(y, x, CV_8U, a[0]); 


    namedWindow("Display window", CV_WINDOW_NORMAL); // Create a window for display. 
    imshow("Display window", image);     // Show our image inside it. 

    return (0); 
} 

此外,我使用此代碼具有相同效果的嘗試:

IplImage* cv_image = cvCreateImageHeader(cvSize(x,y), IPL_DEPTH_8U, 1); 
cvSetData(cv_image, a[0], cv_image->widthStep); 
Mat image = Mat(cv_image, false); 

任何人都可以請幫我解釋一下這是爲什麼我的圖片創建期間發生了什麼?

請注意,不幸的是,我無法提供LV的原始圖像/捕捉,但我可以說它看起來不像這樣,我正在處理所有灰度。

輸出圖像:

Output

回答

0

您的輸入(a)是整數的一個矩陣,而希望的OpenCV那裏uchars。

你這樣做目前,各INT(從)遍佈在連續4個字節, 也是它只是使用輸入數據的第一個1/4(這正是,我在圖片中看到)的方式

你可能不會只喂像素指針到您的簡歷::墊那裏, 遍歷一個[0],鑄造每個像素UCHAR,然後將其分配給OpenCV的像素脫身 應work,imho

+0

謝謝你的迴應,我很驚訝,我沒有注意到。看來,解決這個問題的正確方法是使用char而不是int來調用我的DLL。但是這導致了Labview數據類型問題(不接受char或uint8_t),我已經在他們的論壇上發佈了這些問題。如果這不起作用,我會有一個非常基本的問題引發我的問題:如果我要循環訪問一個[0]並自己進行投射,那麼如何創建另一個具有相同數量元素的數組作爲[0],但是類型爲char。據我所知,我不能在C++中聲明一個未知大小的數組。 – Mich 2013-02-11 21:10:31

0

你可以轉換你的圖像到uchar或簡單地使用一個int圖像通過CV_32U替換CV_8U然後:

int offset = 0; 
int scale = 0; 
cv::Mat image8U; 
image.convertTo(image8U, CV_8UC1, scale, offset); 
+0

謝謝你的迴應,不幸的是,這是爲我顯示一個空白圖像,但尺寸似乎正確。我相信這可能是由於有一個簽名的圖像開始。 – Mich 2013-02-11 21:14:38

+0

我發現這個問題,Scale實際上並不是一個X和Y圖像比例尺,它是每個像素的亮度值的比例,所以當您將其設置爲0時,它會使所有像素變黑。我將Scale設置爲1,一切正常。非常感謝你 – Mich 2013-02-11 21:28:53