作者gmuooo (Miraculous)
看板C_and_CPP
标题Re: [问题] opencv范例请教
时间Fri Aug 14 09:49:07 2009
※ 引述《GN00505257 (...)》之铭言:
仅针对红色部份进行解说
注:还不太熟怎样用颜色去做强调...
: #include "stdafx.h"
: #include <cv.h>
: #include <highgui.h>
: int main( int argc, char** argv ) {
: IplImage* image;
: image=cvLoadImage("image", 1);
: {
: // Compute the HSV image and decompose it into separate planes.
: //
: IplImage* hsv = cvCreateImage( cvGetSize(image), 8, 3 );
: cvCvtColor( image, hsv, CV_BGR2HSV );
: IplImage* h_plane = cvCreateImage( cvGetSize(image), 8, 1 );
: IplImage* s_plane = cvCreateImage( cvGetSize(image), 8, 1 );
: IplImage* v_plane = cvCreateImage( cvGetSize(image), 8, 1 );
: IplImage* planes[] = { h_plane, s_plane };
: cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );
: //
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
对於以上cvCvtPixToPlane, 内容在於把读取到的image, 透过
cvCvtColor将image转换为HSV, 透过cvCvtPixToPlane转换到前面
所设定的h_plane, s_plane, v_plane.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
: cvCalcHist( planes, hist, 0, 0 ); //Compute histogram
//
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这边在於利用cvCalcHist提供计算Historgram的函式, 可以把
planes所指向的影像之Historgram存放於CvHistogram的结构中,
至於後面参数部份, 请参阅Doc
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
: cvNormalizeHist( hist, 1.0 ); //Normalize it
//
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
如果有学过影像处理, 应该都会知道Histogram的正规化, 这函式
就是在处理这些东西
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
: // Create an image to use to visualize our histogram.
: //
: int scale = 10;
: IplImage* hist_img = cvCreateImage(cvSize( h_bins * scale, s_bins * scale )
: ,8 , 3);
: cvZero( hist_img );
: // populate our visualization with little gray squares.
: //
: float max_value = 0;
: cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 );
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这函式, 可以直接取得CvHistogram中最大的元素或是最小元素
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
: for( int h = 0; h < h_bins; h++ ) {
: for( int s = 100; s < s_bins; s++ ) {
: float bin_val = cvQueryHistValue_2D( hist, h, s );
: int intensity = cvRound( bin_val * 255 / max_value );
: cvRectangle(
: hist_img,
: cvPoint( h*scale, s*scale ),
: cvPoint( (h+1)*scale - 1, (s+1)*scale - 1),
: CV_RGB(intensity,intensity,intensity),
: CV_FILLED
: );
: }
: }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这部份应该是你的死角, 简单说他只是把Histogram藉由画图表示出来而已.
主要是将数值量化为你的视窗可以装得范围, 拿笔起来算一下应该就会比较
明白, cvRectangle是在绘图矩形, 但我认为cvRect应该也有同样效果. 看
每个人的取舍. 这边就是将量化後的数值进行座标转换到视窗上, 要注意
绘图的方向是从左上角开始计算或是右下角开始计算.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
以上, 若有遗漏或是错误的地方, 烦请指教更正, 谢谢.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.124.182.10
1F:→ Jockey66666:cvRect不能绘图 =) 08/14 10:15
2F:→ gmuooo:cvDrawRect ... XD, 没注意到, 谢谢。 08/14 14:19
3F:→ Jockey66666:#define cvDrawRect cvRectangle 是一样的 08/14 14:49
4F:推 yyc1217:cvCvtColor = cvSplit 文件里也有写 08/15 02:00
5F:→ GN00505257:感谢你...稍微有点头绪了 08/16 01:43