例如,有QR掃描儀可以實時掃描視頻流並獲取QR碼信息。 我想檢查視頻中的光源,如果它是開啓或關閉,它是相當強大的,所以它沒有問題。如何分析iOS上的視頻流?
我可能會採取視頻流作爲輸入,也許是爲了它的圖像和實時分析圖像或流爲光源的存在(也許編號的圖像上的某些顏色的像素?)
如何我是否會解決這個問題?也許有一些圖書館的來源?
例如,有QR掃描儀可以實時掃描視頻流並獲取QR碼信息。 我想檢查視頻中的光源,如果它是開啓或關閉,它是相當強大的,所以它沒有問題。如何分析iOS上的視頻流?
我可能會採取視頻流作爲輸入,也許是爲了它的圖像和實時分析圖像或流爲光源的存在(也許編號的圖像上的某些顏色的像素?)
如何我是否會解決這個問題?也許有一些圖書館的來源?
這聽起來像你在詢問關於幾個謹慎步驟的信息。有很多種方法可以完成每個步驟,如果您遇到任何單獨的步驟,最好單獨發佈一個關於它的問題。
1:獲取視頻幀
像chaitanya.varanasi說,AVFoundation框架是獲得訪問IOS上的視頻幀的最佳途徑。如果你想要更少的靈活性和更快速的嘗試查看公開簡歷的video capture。這一步的目標是從相機訪問像素緩衝區。如果您遇到問題,請專門詢問。
2:將像素緩衝區中的OpenCV
這部分是很容易的。如果你從openCV的視頻捕獲中獲得它,那麼你已經完成了。如果從AVFoundation得到它,你需要把它放到OpenCV的這樣
//Buffer is of type CVImageBufferRef, which is what AVFoundation should be giving you
//I assume it is BGRA or RGBA formatted, if it isn't, change CV_8UC4 to the appropriate format
CVPixelBufferLockBaseAddress(Buffer, 0);
int bufferWidth = CVPixelBufferGetWidth(Buffer);
int bufferHeight = CVPixelBufferGetHeight(Buffer);
unsigned char *pixel = (unsigned char *)CVPixelBufferGetBaseAddress(Buffer);
cv::Mat image = cv::Mat(bufferHeight,bufferWidth,CV_8UC4,pixel); //put buffer in open cv, no memory copied
//Process image Here
//End processing
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
注意到我假設你打算這樣做OpenCV中,因爲你使用它的標籤。另外我假設你可以獲得OpenCV框架鏈接到你的項目。如果這是一個問題,請提出一個具體的問題。
3:處理圖像
這部分是迄今爲止最開放式的。您所說的關於您的問題的一點是您正在嘗試檢測強光源。一種非常快速簡單的方法就是檢測灰度圖像中的平均像素值。如果您使用彩色圖像,則可以使用cvtColor進行轉換。然後只需撥打Avg即可獲得平均值。希望你可以通過該值的波動來判斷燈是否亮着。
chaitanya.varanasi提出了另一種選擇,你應該檢查出來。
openCV是一個非常大的庫,可以處理各種各樣的事情。不知道更多關於你的問題,我不知道還有什麼要告訴你。
看看蘋果的AVFoundation Framework。
希望它有幫助!
你可以嘗試這種方法:首先讓所有圖像到AVCaptureVideoDataOutput
。從方法:captureOutput:didOutputSampleBuffer:fromConnection
,您可以採樣/計算每個像素。來源:answer
另外,你可以看看這個SO question他們檢查一個像素是否是黑色的。如果它具有如此強大的光源,則可以取像素的倒數,然後使用設定的黑色閾值來確定。
上述示例代碼僅提供對存儲在緩衝區中的像素值的訪問;你不能運行任何其他命令,但那些改變逐像素的基礎上的價值觀:
cv::Mat bgraImage = cv::Mat((int)height, (int)extendedWidth, CV_8UC4, base);
cv::Mat grey = bgraImage.clone();
cv::cvtColor(grey, grey, 44);
:
for (uint32_t y = 0; y < height; y++)
{
for (uint32_t x = 0; x < width; x++)
{
bgraImage.at<cv::Vec<uint8_t,4> >(y,x)[1] = 0;
}
}
這對使用你的榜樣,不會跟你提供的代碼工作