2011-06-16 31 views
1

我想在較大的圖像上添加較小的圖像(最終用於視頻輸入上的PiP)。我可以通過遍歷大圖像中的相關數據屬性並添加小圖像中的像素來完成此操作。但是,有沒有更簡單更整潔的方式?我正在使用EMGU。是否可以使用OpenCV進行畫中畫?

我的想法是在與小圖像大小相同的大圖像中定義ROI。將大圖像設置爲等於小圖像,然後簡單地移除ROI。即在僞代碼:

Large.ROI = rectangle defined by small image; 

Large = Small; 

Large.ROI = Rectangle.Empty; 

然而,這並不工作,大圖像不會改變。任何建議將不勝感激。

大圖:
Large Image

小圖:
Small Image

期望的結果:
Desired Result

+0

你使用的是C還是Python?你究竟如何做Large = Small作業?既然你說它不起作用,你可能有一些代碼,所以如果你也發佈了這個代碼會很好。 – 2011-06-16 21:35:55

+1

因爲他被標記爲「emgu」,所以它可能是emgucv。我希望emgucv的人會停止標記/調用它opencv ... – etarion 2011-06-16 21:43:38

+0

沒有注意到有關EMGU的一點,所以它不是C和Python之間的選擇。但問題仍然存在:您使用哪種語言? – 2011-06-16 21:45:08

回答

0

我有很多有經驗的EMGU。據我所知,採用這種方法是在大圖像中顯示子圖像數據的唯一直接方式。您可能需要刷新較大的圖像,這樣可以清除傳輸的數據並將較小的圖像複製回來。

雖然有可能的解決方案,但我認爲該方法存在缺陷。所需的處理時間將影響較大觀看幀中任何圖像的顯示速率。

改進的方法是添加另一個控件。實際上,您的視頻供稿窗口會在背景中顯示較大的圖片,而較小的控件會顯示較小的圖片。實際上,您可以擁有儘可能多的這些較小的控件。實際上,您將在兩個不同的控件(例如圖像框)中顯示兩個圖像或視頻源。因爲你有這樣的代碼,所以你只需要確保你的控件的顯示順序。

我假設你沒有將輸出編程到控制檯窗口。如果您需要更多幫助,請隨時詢問。

至於評論EMGU是用C#編寫的,雖然非常感謝您關於不調用EMGU OpenCV的觀點,爲什麼它不應該被標記爲面向OpenCV的問題。畢竟EMGU只是使用c#封裝的OpenCV庫。我發現OpenCV上的許多資源對EMGU有用,反之亦然。

乾杯 克里斯

3

如果您在使用C++ API然後將下面的代碼應該工作:

cv::Mat big; 
cv::Mat small; 

// Define roi area (it has small image dimensions). 
cv::Rect roi = cv::Rect(50,50, small.cols, small.rows); 

// Take a sub-view of the large image 
cv::Mat subView = big(roi); 

// Copy contents of the small image to large 
small.copyTo(subView); 

小心不要出門大圖像的尺寸。

+0

我想你的意思是寫'cv :: Mat subview = big(roi)'? – Chris 2012-07-02 12:02:52

+0

@Chris謝謝!錯過了。 – BloodAxe 2012-07-02 12:16:47

1

我不知道這是否有幫助,我沒有使用emgu。然而,這是我能夠用opencv在圖像中完成圖像的方式。

drawIntoArea(Mat &src, Mat &dst, int x, int y, int width, int height) 
{ 
    Mat scaledSrc; 
    // Destination image for the converted src image. 
    Mat convertedSrc(src.rows,src.cols,CV_8UC3, Scalar(0,0,255)); 

    // Convert the src image into the correct destination image type 
    // Could also use MixChannels here. 
    // Expand to support range of image source types. 
    if (src.type() != dst.type()) 
    { 
     cvtColor(src, convertedSrc, CV_GRAY2RGB); 
    }else{ 
     src.copyTo(convertedSrc); 
    } 

    // Resize the converted source image to the desired target width. 
    resize(convertedSrc, scaledSrc,Size(width,height),1,1,INTER_AREA); 

    // create a region of interest in the destination image to copy the newly sized and converted source image into. 
    Mat ROI = dst(Rect(x, y, scaledSrc.cols, scaledSrc.rows)); 
    scaledSrc.copyTo(ROI); 
} 
相關問題