討論區快速選單
知識庫快速選單
程式設計俱樂部Facebook粉絲團 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
如何讀出影像的陣列??
更改我的閱讀文章字型大小
作者 : hahn9999(小鈦大無敵)
[ 貼文 10 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/17 下午 07:24:51
各位好:

想請教大家一個問題

就是我已經利用了OPENCV的一些函式去做簡單的處理

程式碼如下:

#include "stdafx.h"
#include <cv.h>
#include <highgui.h>

IplImage *src = 0;
IplImage *tmp = 0;
IplImage *tmp1 = 0;

using namespace System;

[color=#FF0000]void YCrCb_range(unsigned char image_in[Y_SIZE][X_SIZE])
{
int i,j;
int Y[640][480], Cr[640][480], Cb[640][480];

 for(i=0;i<Y_SIZE; i++){
for(j=0; j<X_SIZE; j++){
}[/color]

int main(array<System::String ^> ^args)
{
    src = cvLoadImage("hand1.jpg",1);
    cvNamedWindow("src",0);
    cvShowImage("src",src);
    
    tmp = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
    tmp1 = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
    
    cvCvtColor(src,tmp, CV_RGB2YCrCb);
    cvNamedWindow("tmp",0);
    cvShowImage("tmp",tmp);
    cvWaitKey(0);
}

紅色字的部分就是我想請教大家的問題

我想將RGB轉YCrCb之後的圖片tmp

把裡面的Y、Cr、Cb個別抓出來放到矩陣裡面

然後在個別去設定我要的範圍,因為我要做皮膚分割的處理!!

所以想請假大家一下這個問題~~!

請大家給我點指導謝謝!!
作者 : yinglung(CoolLong)
[ 貼文 107 | 人氣 2565 | 評價 150 | 評價/貼文 1.4 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/19 上午 11:30:44

>
>我想將RGB轉YCrCb之後的圖片tmp
>
>把裡面的Y、Cr、Cb個別抓出來放到矩陣裡面
>
>然後在個別去設定我要的範圍,因為我要做皮膚分割的處理!!
>
>所以想請假大家一下這個問題~~!
>
>請大家給我點指導謝謝!!
Y=0.299*R + 0.587*G + 0.114*B
Cb=0.564*(B-Y) = -0.169*R - 0.331*G + 0.500*B
Cr=0.713*(R-Y) = 0.500*R - 0.419*G - 0.081*B
作者 : hahn9999(小鈦大無敵)
[ 貼文 10 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/21 上午 09:49:56
>Y=0.299*R + 0.587*G + 0.114*B
>Cb=0.564*(B-Y) = -0.169*R - 0.331*G + 0.500*B
>Cr=0.713*(R-Y) = 0.500*R - 0.419*G - 0.081*B
>

這部分我已經轉好了,就是上面程式碼中的cvCvtColor(src,tmp, CV_RGB2YCrCb);這段

但我的問題是

我不知道該如何去讀取裡面的Y、Cr、Cb,

我要讀出來個別放在陣列裡面我才可以設定Range去做皮膚分割

類似以下這種想法:

IF(Cr<72 || Cr >125 || Cb<130 || Cb>145)

則 Y[i][j] = 0;
    Cr[i][j] = 0;
    Cb[i][j] = 0;

類似的這種想法!!!

因為OPENCV的IMAGE資料型態

我有試過,好像不能跟C或C++共用

可能是我功力不夠強

所以想請教一下大家!!


作者 : yinglung(CoolLong)
[ 貼文 107 | 人氣 2565 | 評價 150 | 評價/貼文 1.4 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人hahn9999註記此篇回應為最佳解答 2009/12/21 上午 10:57:38

>各位好:
>
>想請教大家一個問題
>
>就是我已經利用了OPENCV的一些函式去做簡單的處理
>
>程式碼如下:
>
>#include 'stdafx.h'
>#include <cv.h>
>#include <highgui.h>
>
IplImage *src = 0;
IplImage *tmp = 0;
IplImage *tmp1 = 0;
IplImage* Y,*Cr, *Cb; <---加這行


using namespace System;

void YCrCb_range(unsigned char image_in[Y_SIZE][X_SIZE])
{
int i,j;
int Y[640][480], Cr[640][480], Cb[640][480];

for(i=0;i<Y_SIZE; i++){
for(j=0; j<X_SIZE; j++){
}

int main(array<System::String ^> ^args)
{
    src = cvLoadImage('hand1.jpg',1);
    cvNamedWindow('src',0);
    cvShowImage('src',src);
    
    tmp = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
    tmp1 = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);
    
    cvCvtColor(src,tmp, CV_RGB2YCrCb);
    //把tmp裡面有Y,Cb,Cr三個通道的資料,分解開來
    cvSplit(tmp,Y,Cr,Cb,0); <---加這行(Ps: Y,Cr,Cb的位置我忘了要記得自己試)
    cvNamedWindow('tmp',0);
    cvShowImage('tmp',tmp);
    cvWaitKey(0);
}



作者 : hahn9999(小鈦大無敵)
[ 貼文 10 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/21 下午 12:51:47
非常感謝 yinglung 大大的指導

不好意思再麻煩請教一個問題

假設我順利將Y、Cr、Cb給分離出來

並且也設定好Range了


那我要顯示看看我的結果是否符合我所要的

只切割出來皮膚部分的畫面

那我需要將經過cvSplit()這個函式分離出來的的Y、Cr、Cb

再合在一起嗎???

因為我有看到cvMerge() 和 cvMixChannels() 這兩個函式

不好意思 再麻煩yinglung大大給我點指導 謝謝你!!!

作者 : yinglung(CoolLong)
[ 貼文 107 | 人氣 2565 | 評價 150 | 評價/貼文 1.4 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/21 下午 04:50:02

>非常感謝 yinglung 大大的指導
>
>不好意思再麻煩請教一個問題
>
>假設我順利將Y、Cr、Cb給分離出來
>
>並且也設定好Range了
>
>
>那我要顯示看看我的結果是否符合我所要的
>
>只切割出來皮膚部分的畫面
>
>那我需要將經過cvSplit()這個函式分離出來的的Y、Cr、Cb
>
>再合在一起嗎???
>
>因為我有看到cvMerge() 和 cvMixChannels() 這兩個函式
>
>不好意思 再麻煩yinglung大大給我點指導 謝謝你!!!
>
>

看上面敘述
我猜測你要看的圖
應該是要把處理好的YCrCb 合併回去
那用cvMerge()這個就行了
作者 : hahn9999(小鈦大無敵)
[ 貼文 10 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/21 下午 08:54:38
不好意思

我合併不回去ㄟ

不知道是哪裡出了問題

可以麻煩你指導我嗎!!?
作者 : hahn9999(小鈦大無敵)
[ 貼文 10 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/21 下午 10:46:08
yinglung大大你好

不好意思我自己的問題

我合併好了

但是還是有關Range的問題想請教您

不知道方不方便給我E-mail

我將程式碼寄給你

比較好講我的問題在哪!!!

如果可以的話請給我個答覆 感恩!!

謝謝
作者 : yinglung(CoolLong)
[ 貼文 107 | 人氣 2565 | 評價 150 | 評價/貼文 1.4 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2009/12/22 上午 10:48:42

>yinglung大大你好
>
>不好意思我自己的問題
>
>我合併好了
>
>但是還是有關Range的問題想請教您
>
>不知道方不方便給我E-mail
>
>我將程式碼寄給你
>
>比較好講我的問題在哪!!!
>
>如果可以的話請給我個答覆 感恩!!
>
>謝謝

上面回覆的~我都是用Google查出來的
老實說我沒用過OpenCv
所以你要問的問題可能會無法解答喔
作者 : easylook3d1(福州伯)
[ 貼文 32 | 人氣 0 | 評價 60 | 評價/貼文 1.88 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/2/21 下午 09:46:36
>類似以下這種想法:
>
>IF(Cr<72 || Cr >125 || Cb<130 || Cb>145)
>
>則 Y[i][j] = 0;
> Cr[i][j] = 0;
> Cb[i][j] = 0;
>
C and C++其實在dev c++都可以共用啦!要把Image型別的資料強制轉成整數才能做If ....比較吧!char 好像不可以
作者 : mattufo0326(嫩嫩)
[ 貼文 7 | 人氣 153 | 評價 40 | 評價/貼文 5.71 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人hahn9999註記此篇回應為很有道理 2010/3/4 上午 10:50:58
這是我自己寫的YCrCb轉換拉,提供給你。 這是可以將膚色區域過濾出來,不是膚色的區域將為黑色。
我的作業軟體 OpenCV2.0 VC2008

#include <cxcore.h>
#include <cv.h>
#include <highgui.h>

void SkinColorDetection( IplImage* src, IplImage* dst );

int _tmain(int argc, _TCHAR* argv[])
{
   IplImage* src = cvLoadImage( "src.jpg", -1 );
   IplImage* dst = cvCreateImage( cvGetSize( src ), src->depth, 3 );
   cvNamedWndow( "src", 1 );
   cvNamedWindow( "dst", 1 );
  SkinColorDetection( src, dst );
   cvShowImage( "src", src );
   cvShowImage( "dst", dst );
   cvWaitKey( );
   cvDestroyAllWindows();
   cvReleaseImage( &src );
   cvReleaseImage( &dst );
   return 0;
}

void SkinColorDetection( IplImage* src, IplImage* dst )
{
   for( int y = 0; y < src->height; y++ )
  {
     for( int x = 0; x < src->width; x++ )
     {
     int R = ( ( uchar * )( src->imageDate + y * src->widthStep ) )[ x * src->nChannels + 0 ];
     int G = ( ( uchar * )( src->imageDate + y * src->widthStep ) )[ x * src->nChannels + 1 ];
     int B = ( ( uchar * )( src->imageDate + y * src->widthStep ) )[ x * src->nChannels + 2 ];
     float Y= 0.299*R + 0.587*G + 0.114*B;
     float Cb=0.564*(B-Y);
     float Cr = Cr=0.713*(R-Y);
     if( 膚色條件式 )
     {
     ( ( uchar * )( dst->imageDate + y * dst->widthStep ) )[ x * dst->nChannels + 0 ] = ( ( uchar * )( src->imageDate + y * src->widthStep ) )[ x * src->nChannels + 0 ];
     ( ( uchar * )( dst->imageDate + y * dst->widthStep ) )[ x * dst->nChannels + 1 ] = ( ( uchar * )( src->imageDate + y * src->widthStep ) )[ x * src->nChannels + 1 ];
     ( ( uchar * )( dst->imageDate + y * dst->widthStep ) )[ x * dst->nChannels + 2 ] = ( ( uchar * )( src->imageDate + y * src->widthStep ) )[ x * src->nChannels + 2 ];
     }
     else
     {
     ( ( uchar * )( dst->imageDate + y * dst->widthStep ) )[ x * dst->nChannels + 0 ] = ( uchar )0;
     ( ( uchar * )( dst->imageDate + y * dst->widthStep ) )[ x * dst->nChannels + 1 ] = ( uchar )0;
     ( ( uchar * )( dst->imageDate + y * dst->widthStep ) )[ x * dst->nChannels + 2 ] = ( uchar )0;
     }
   }
   return -1;
}
作者 : hahn9999(小鈦大無敵)
[ 貼文 10 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 5 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2010/3/16 下午 12:43:10
你好唷抱歉這麼晚才回!!

你的意見很不錯

其實你這個方法就是我一開始真正想要的做法

只是後來我用全部都OPENCV的函式去用


也不知道用他們的函式比較好還是有些自己寫比較好??

不知道這位大大有什麼看法嗎?
 板主 : 徵求中
 > 影像處理與計算機圖學 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - 影像處理與計算機圖學 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
影像處理與計算機圖學
1 Linkin 780 
2 CrazyStar 400 
3 青衫 360 
4 白老鼠(Gary) 330 
5 悠悠深藍 220 
6 none 220 
7 shou 200 
8 ultra 200 
9 ghost 140 
10 ozzy 130 
影像處理與計算機圖學
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
7.800293E-02