android 动态矩形条,android – 从相机中动态检测不同形状(圆形,方形和矩形)?
更新:這個StackOverflow帖子(包含一些很好的樣本圖片)似乎至少解決了你的問題的
circles detection部分.他指出的優(yōu)秀文章的參考資料可以在
wiki page上找到(不幸的是只能通過回程機器).
如果new link也沒有,則以下是相關部分:
檢測圖像:
有一些需要注意檢測圖像中的圓圈的小巧位.在使用cvHoughCircles(圓形檢測功能)處理圖像之前,您可能希望先將其轉(zhuǎn)換為灰色圖像并使其平滑.以下是您需要使用的函數(shù)的一般過程及其用法示例.
創(chuàng)建圖像
假設您有一個名為’img’的初始處理圖像,首先要創(chuàng)建一個名為’gray’的圖像變量,其尺寸與使用cvCreateImage的img相同.
IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );
// allocate a 1 channel byte image
CvMemStorage* storage = cvCreateMemStorage(0);
IplImage* cvCreateImage(CvSize size, int depth, int channels);
size: cvSize(width,height);
depth: pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,
IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F, IPL_DEPTH_64F
channels: Number of channels per pixel. Can be 1, 2, 3 or 4. The channels
are interleaved. The usual data layout of a color image is
b0 g0 r0 b1 g1 r1 ...
轉(zhuǎn)換為灰色
現(xiàn)在你需要使用cvCvtColor將它轉(zhuǎn)換為灰色,cvCvtColor在顏色空間之間進行轉(zhuǎn)換.
cvCvtColor( img, gray, CV_BGR2GRAY );
cvCvtColor(src,dst,code); // src -> dst
code = CV_2
/ = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS
e.g.: CV_BGR2GRAY, CV_BGR2HSV, CV_BGR2Lab
流暢的圖像
這樣做是為了防止檢測到許多假圓圈.您可能需要使用最后兩個參數(shù),注意它們需要乘以奇數(shù).
cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 );
// smooth it, otherwise a lot of false circles may be detected
void cvSmooth( const CvArr* src, CvArr* dst,
int smoothtype=CV_GAUSSIAN,
int param1, int param2);
SRC
>源圖像.
DST
>目標圖像.
smoothtype
平滑的類型:
> CV_BLUR_NO_SCALE(沒有縮放的簡單模糊) – 像素param1×param2鄰域的總和.如果鄰域大小不固定,可以使用cvIntegral函數(shù).
> CV_BLUR(簡單模糊) – 在像素param1×param2鄰域上求和,隨后按1 /(param1?param2)縮放.
> CV_GAUSSIAN(高斯模糊) – 使用param1×param2高斯卷積圖像.
> CV_MEDIAN(中位數(shù)模糊) – 找到param1×param1鄰域的中值(即鄰域是正方形).
> CV_BILATERAL(雙邊濾波器) – 應用雙邊3×3濾波,顏色sigma = param1和space sigma = param2
參數(shù)1
>平滑操作的第一個參數(shù).
參數(shù)2
>平滑操作的第二個參數(shù).
如果param2為零,則在簡單縮放/非縮放和高斯模糊的情況下,將其設置為param1
使用Hough Circle檢測
函數(shù)cvHoughCircles用于檢測灰度圖像上的圓圈.最后兩個參數(shù)可能需要擺弄.
CvSeq* circles =
cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 100 );
CvSeq* cvHoughCircles( CvArr* image, void* circle_storage,
int method, double dp, double min_dist,
double param1=100, double param2=100,
int min_radius=0, int max_radius=0 );
=======相關部分結束=========
該wiki頁面的其余部分實際上非常好(雖然,我不會在這里重新復制它,因為其余部分與原始問題無關,而StackOverflow的答案大小有限).希望link到Wayback機器上的緩存副本將繼續(xù)無限期地工作.
我的更新之前的回答:
大!現(xiàn)在您已經(jīng)發(fā)布了一些示例,我可以看到您不僅僅是在矩形,方形矩形和圓形之后,您還希望在3D環(huán)境中找到這些形狀,從而可能尋找視頻中的平行四邊形和橢圓形的特殊情況幀到視頻幀最終可以顯示為矩形,正方形和/或圓形(取決于您如何平移相機).
就個人而言,我發(fā)現(xiàn)自己解決問題比嘗試理解如何使用現(xiàn)有(通常是非常成熟的)庫更容易.這并不是說我自己的工作會比成熟的圖書館更好,它肯定不會.只是一旦我可以自己解決問題,那么我就更容易理解和使用一個庫(庫本身通常比我自己的解決方案運行得更快更智能).
因此,我將采取的下一步是將位圖的顏色空間更改為灰度.一個顏色位圖,我很難理解,我操作起來很麻煩,特別是因為有很多不同的方式可以表示,但是灰度位圖,這更容易理解和操作.對于灰度位圖,只需想象一個值網(wǎng)格,每個值representing具有不同的光強度.
現(xiàn)在,讓我們將問題的范圍限制在靜態(tài)2D環(huán)境中尋找平行四邊形和橢圓形(我們將擔心稍后處理3D環(huán)境和移動視頻幀,或者我應該說,你自己會擔心這個部分這個問題對我來說已經(jīng)變得太復雜了).
而且就目前而言,我們不用擔心您使用的工具或語言.只需使用最簡單,最快捷的方法.例如,假設時間沒有問題,幾乎任何東西都可以編寫腳本以自動將圖像轉(zhuǎn)換為灰度. ImageMagick,Gimp,Marvin,Processing,Python,Ruby,Java等.
對于任何這些工具,應該很容易將具有相似足夠強度的像素分組(以使計算更易于管理),并為每個光強度桶對不同陣列中的每個像素坐標進行排序.換句話說,按照包含每個像素的x和y位置的強度排序某種粗略的陣列直方圖應該不會太困難.
之后,問題變得更像this one(可以在StackOverflow上找到),因此可以使用其建議的解決方案.
一旦你能夠以這種方式解決問題,那么將你提出的解決方案轉(zhuǎn)換為適合任務的更好的語言應該不會太困難.并且理解和使用您最終為任務選擇的任何現(xiàn)有庫的基礎功能也應該更容易.至少,這就是我所希望的,因為我不夠熟悉,我無法真正幫助你自己使用OpenCV庫.
總結
以上是生活随笔為你收集整理的android 动态矩形条,android – 从相机中动态检测不同形状(圆形,方形和矩形)?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android怎么实现选课功能,选课系统
- 下一篇: android edittext设置内容