Trang 2 / 6 FirstFirst 12345 ... LastLast
Hiển thị kết quả từ 11 đến 20 / 59
  1. #11
    Tham gia
    06-10-2007
    Location
    Hà Nội
    Bài viết
    22
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi sephiroth2m View Post
    Chào bạn, bạn có một bài toán nhờ mọi người giải trong khi không cho biết cụ thể đề bài như thế nào. Bạn cần tối ưu các thuật toán xử lý ảnh hay hiển thị ảnh? Thuật toán của bạn như thế nào? Có thể post lên đây được không.
    Thu tuc load anh va luu anh vao ma tran 2 chieu

    void __fastcall TFrmMain::NewProject1Click(TObject *Sender)
    {
    StatusBar->Panels->Items[0]->Text ="Loading...";StatusBar->Refresh();
    StereoControl->Stereo->LeftImg->LoadFromFile("D:\\LAPTRINH\\ISVN\\Images\\cone_le ft.bmp");
    StereoControl->Stereo->RightImg->LoadFromFile("D:\\LAPTRINH\\ISVN\\Images\\cone_ri ght.bmp");
    StereoControl->Stereo->Mode=4;//(int)VideoModeComboBox->Items->Objects[VideoModeComboBox->ItemIndex];
    StereoControl->Stereo->ColorLeft = clRed;
    StereoControl->Stereo->ColorRight = RGB(0,255,255);
    StereoControl->Glasses->SetCompatibleMode(StereoControl->Stereo->Mode);
    StereoControl->Cursor = crCross;
    bViewPan = false;
    bStepViewPan = false;
    dScaleZoom = 1;
    iHL = StereoControl->Stereo->LeftImg->Height;
    iWL = StereoControl->Stereo->LeftImg->Width;
    iHR = StereoControl->Stereo->RightImg->Height;
    iWR = StereoControl->Stereo->RightImg->Width;
    //Luu ma tran do xam cua 2 anh vao 2 mang
    ImageL.Length = iWL;
    ImageR.Length = iWR;
    for (int i = 0;i<iWL;i++) ImageL[i].Length = iHL;
    for (int i = 0;i<iWR;i++) ImageR[i].Length = iHR;
    for (int i = 0;i<iWL;i++)
    for (int j = 0;j<iHL;j++) ImageL[i][j]= (int)StereoControl->Stereo->LeftImg->Canvas->Pixels[i][j];
    for (int i = 0;i<iWR;i++)
    for (int j = 0;j<iHR;j++) ImageR[i][j]= (int)StereoControl->Stereo->RightImg->Canvas->Pixels[i][j];
    StereoControl->Stereo->Update();
    StereoControl->Stereo->Active=true;
    StereoControl->Glasses->Active=true;
    StatusBar->Panels->Items[0]->Text ="Loading...done!";StatusBar->Refresh();
    }
    //---------------------------------------------------------------------------
    //Thu tuc Zoom anh, moi lam room in
    void __fastcall TFrmMain::ZoomImage(double dScale)
    {int iColor;
    byte iR,iG,iB,iP;
    StereoControl->Stereo->Clear();
    ///Zoom In
    if (dScale >= 1)
    {int iScale = (int)dScale;
    StatusBar->Panels->Items[0]->Text ="Zooming Left Image...";StatusBar->Refresh();
    StereoControl->Stereo->LeftImg->Height*=iScale;
    StereoControl->Stereo->LeftImg->Width*=iScale;
    for (int j=0;j<iHL;j++)
    for (int i=0;i<iWL;i++)
    {iColor = ImageL[i][j];
    ColorToRGBP(iColor,iR,iG,iB,iP);
    for (byte k=0;k<iScale;k++)
    for (byte l=0;l<iScale;l++)StereoControl->Stereo->LeftImg->Canvas->Pixels[i*iScale+k][j*iScale+l]=(TColor)(iColor);
    }
    StatusBar->Panels->Items[0]->Text ="Zooming Left Image...done";
    StatusBar->Panels->Items[1]->Text ="Zooming Right Image...";StatusBar->Refresh();
    StereoControl->Stereo->RightImg->Height*=iScale;
    StereoControl->Stereo->RightImg->Width*=iScale;
    for (int j=0;j<iHR;j++)
    for (int i=0;i<iWR;i++)
    {iColor = ImageR[i][j];
    for (byte k=0;k<iScale;k++)
    for (byte l=0;l<iScale;l++)StereoControl->Stereo->RightImg->Canvas->Pixels[i*iScale+k][j*iScale+l]=(TColor)(iColor);
    }
    StatusBar->Panels->Items[1]->Text ="Zooming Right Image...done";StatusBar->Refresh();
    }//end if Zoom In
    ///Zoom Out
    //StatusBar->Panels->Items[2]->Text =StereoControl->Stereo->ClassName();
    StereoControl->Stereo->Update();
    }

    // Nho cac Pro giup nhe. Cam on nhiu

  2. #12
    Tham gia
    21-06-2004
    Bài viết
    121
    Like
    0
    Thanked 1 Time in 1 Post
    Đoạn luu ma tran do xam cua 2 anh vao 2 mang bạn có thể tối ưu hóa được như sau:
    Code:
    int iSizeL = iWL * iHL * color_depth;
    int iSizeR = iWR * iHR * color_depth;
    
    ImageL = new char[iSizeL];
    ImageR = new char[iSizeR];
    
    memcpy(ImageL, StereoControl->Stereo->LeftImg->Canvas->Pixels, iSizeL);
    memcpy(ImageR , StereoControl->Stereo->RightImg->Canvas->Pixels, iSizeR);
    Về giải thuật zoom ảnh bạn có thể tham khảo 1 bài viết khá hay trên CodeGuru: http://www.codeguru.com/cpp/g-m/bitm...cle.php/c4897/

    Trước đây tôi có thử tạo 1 bộ thư viện nho nhỏ về đồ họa nhưng có đầy đủ các chức năng zoom, rotate v.v... tốc độ chạy cũng... kha khá, nhưng thư viện này làm việc với các đối tượng CBitmap và được viết bằng VC++. Nếu bạn muốn tham khảo tôi sẽ gửi qua email cho bạn.

  3. #13
    Tham gia
    06-10-2007
    Location
    Hà Nội
    Bài viết
    22
    Like
    0
    Thanked 0 Times in 0 Posts
    Quote Được gửi bởi sephiroth2m View Post
    Đoạn luu ma tran do xam cua 2 anh vao 2 mang bạn có thể tối ưu hóa được như sau:
    Code:
    int iSizeL = iWL * iHL * color_depth;
    int iSizeR = iWR * iHR * color_depth;
    
    ImageL = new char[iSizeL];
    ImageR = new char[iSizeR];
    
    memcpy(ImageL, StereoControl->Stereo->LeftImg->Canvas->Pixels, iSizeL);
    memcpy(ImageR , StereoControl->Stereo->RightImg->Canvas->Pixels, iSizeR);
    Về giải thuật zoom ảnh bạn có thể tham khảo 1 bài viết khá hay trên CodeGuru: http://www.codeguru.com/cpp/g-m/bitm...cle.php/c4897/

    Trước đây tôi có thử tạo 1 bộ thư viện nho nhỏ về đồ họa nhưng có đầy đủ các chức năng zoom, rotate v.v... tốc độ chạy cũng... kha khá, nhưng thư viện này làm việc với các đối tượng CBitmap và được viết bằng VC++. Nếu bạn muốn tham khảo tôi sẽ gửi qua email cho bạn.
    Thật là Pro, tôi sẽ thử viết lại xem, nhưng tôi vẫn chưa hiểu đoạn CODE bạn viết lém. Gửi cho tôi nhé, tôi ở HN, a e có dịp gặp ọp lai kết tình bằng hữu nhé. Tôi dạy ở trường ĐH Mỏ ĐC
    Email: trantrunganh@humg.edu.vn
    Rất cảm ơn bạn.

  4. #14
    Tham gia
    20-12-2004
    Bài viết
    324
    Like
    56
    Thanked 44 Times in 27 Posts
    Coding như thế, hèn gi 5000x5000 chậm là phải. Tôi xin optimize dùm bạn vài vòng for, nhưng cái tương tự cứ thế mà làm. Có lẽ dễ hiểu hơn, vì có thể bạn override [][] nên tôi không dám chắc đoạn mã của tôi chạy được.

    Code:
    for (
    register int i = 0,
    register int w = iWL,
    register int h = iHL,
    register [pointer] p = ImageL;
    i < w; ++i, ++p)
    {
    	p->Length = h;
    }
    Code:
    for (
    register int i = 0,
    register int w = iWL,
    i < w; ++i)
    {	
    	for (
    	register int j = 0,
    	register int h = iHL,
    	register [pointer] p = ImageL[i],
    	register [pointer] pix = StereoControl->Stereo->LeftImg->Canvas->Pixels[i];
    	j < h; ++h)
    	{
    		*p++ = *pix++;
    	}
    }
    Code:
    pointer pix = StereoControl->Stereo->LeftImg->Canvas->Pixels;
    int max_scale = iScale;
    
    for (
    register int j = 0,
    register int h = iHL,
    register int j_scale = 0;
    j < h;
    ++j, j_scale += max_scale)
    {
    	
    	for (
    	register int i = 0,
    	register int w = iWL,
    	register int i_scale = 0;
    	i < w;
    	++i, i_scale += max_scale)
    	{
    		iColor = ImageL[i][j];
    		ColorToRGBP(iColor,iR,iG,iB,iP);
    
    		for (
    		register int k_index = i_scale;
    		register int k_max = k_index + max_scale;
    		k_index  < k_max;
    		++k_index)
    		{
    			for (
    			register int l_index = j_scale;
    			register int l_max = l_index + max_scale;
    			l_index  < l_max;
    			++l_index)
    			{
    				pix[k_index][l_index]=(TColor)(iColor);
    			}
    		}
    	}
    }
    Box thứ 3 có
    Code:
    pix[k_index][l_index]=(TColor)(iColor);
    còn có thể tối ưu như box thứ 2. Những gì tôi viết còn có thể tối ưu hơn nữa, nhưng tôi thấy viết đủ đơn giản như thế để bạn có thể hiểu, tự mình optimize nó.

    Code của bạn viết như rác, nói thật xin đừng mất lòng. Có lẽ bạn không phải dân trong nghề nên không được đào tạo bài bản. Nếu bạn không hiểu những gì sephiroth2m viết, thì có lẽ bạn cũng không hiểu bạn đang viết gì.

  5. #15
    Tham gia
    06-10-2007
    Location
    Hà Nội
    Bài viết
    22
    Like
    0
    Thanked 0 Times in 0 Posts
    Code của bạn viết như rác, nói thật xin đừng mất lòng. Có lẽ bạn không phải dân trong nghề nên không được đào tạo bài bản. Nếu bạn không hiểu những gì sephiroth2m viết, thì có lẽ bạn cũng không hiểu bạn đang viết gì. [/QUOTE]

    Hihihi. Không mất lòng đâu, tôi là dân ngoại đạo với tin học, kĩ thuật thuần túy, nhưng lại hay phải sử lý các bài toán bằng công cụ này. Đúng là không được đào tạo bài bản, trước đây năm 1 ĐH thì học Pascal for DOS, vào chuyên ngành đẩy thụt lùi học Fortral 77. Hỡi ôi cái nền GD VN, chán lém bạn à. Bạn có biết nơi nào đào tạo cái vụ lập trình xử lý ảnh này không, tôi muốn đi học để rửa cái đầu óc tý. Rất cảm ơn bạn đã bỏ công sức ra chỉ bảo. Tham gia mấy diễn đàn, chỉ có diễn đàn này là tôi thấy các bạn thật nhiệt tình. THANK KIU nhiều lém.
    Sẽ nghiên cứu CODE của bạn từ từ, vì mới đọc sách C++ mà, kekekek

  6. #16
    Tham gia
    20-12-2004
    Bài viết
    324
    Like
    56
    Thanked 44 Times in 27 Posts
    Vậy để tôi nói cho bạn biết 2 nguyên tắc cơ bản nhất để gia tăng tốc độ thực thi của đoạn mã của bạn.

    1. Nếu một biến được đọc/ghi nhiều lần, hãy đặt nó vào vùng nhớ có tốc độ đọc ghi nhanh hơn.

    Ví dụ như biểu thức so sánh i<iWL trong for được thực hiện nhiều lần (5000 lần) trong khi iWL thực chất là this->iWL, nhìn một cách trực quan sẽ thấy nó phải thực hiện 3 bước, (i) lấy giá trị của this (VC++ thường để trong register), (ii) rồi cộng một giá trị offset, mới lấy được địa chỉ của iWL, (iii) và lấy giá trị của iWL ở vùng nhơ Heap. Vậy hãy khai báo một biến mới, nó sẽ được đặt trong stack (nhanh hơn heap) hoặc register của CPU (nhanh hơn nhiều), giữ giá trị của iWL để dùng.

    Có thể thấy sử dụng StereoControl->Stereo->RightImg->Canvas->Pixels trong vòng for là rất kém. Dùng một biến con trỏ mới lưu địa chỉ của Pixels sẽ giảm thời gian đọc/ghi rất nhiều.

    2. Giảm thiểu tính toán, thay các phép nhân chia bằng cộng trừ nếu có thể.

    Hãy nhìn xem Pixels[i*iScale+k][j*iScale+l]=(TColor)(iColor); vụng về đến mức nào. iScale là không thay đổi, trong khi ij chỉ tăng 1 đơn vị theo từng vòng lặp for. Vậy thay vì i*Scale thì dùng i_scale, với mỗi vòng for thì i_scale += iScale. Còn i_scale + k thì sao, ta thấy rõ ràng i_scale là không đổi trong cả một for, vậy thay vì dùng k từ 0 -> iScale, ta dùng k_index từ i_scale -> i_scale + iScale.

    Chỉ cần chừng đó là đủ tăng tốc những module bạn viết rồi. Đương nhiên còn nhiều nguyên tắc khác, nhưng tôi không đủ thời gian để viết ra đây. Nếu bạn quan tâm thì cố gằng kiếm những tutorial mà đọc. Tôi hy vọng những ý kiến của tôi có thể cải thiện được chương trình của bạn.

  7. #17
    Tham gia
    18-05-2006
    Bài viết
    52
    Like
    0
    Thanked 0 Times in 0 Posts
    Bạn có biết nơi nào đào tạo cái vụ lập trình xử lý ảnh này không, tôi muốn đi học để rửa cái đầu óc tý.
    Lãnh vực ncuu để máy tính nhìn được như người gọi là computer vision, rất khó.

    Nói xấu dân ncuu xử âm thanh và văn bản một chút. Người ta bảo một tấm ảnh đáng giá ngàn lời. Do đó nếu các lãnh vực trên đều khó và học mất thời gian, thì đầu tư học về computer vision thì "ngon" hơn phải k ạ

    Chúng tôi có vài người đang cùng bắt đầu ncuu computer vision. Bạn nào có cùng interest, xin gửi mail tự giới thiệu đến trưởng nhóm Vũ virces931511@yahoo.com. Nếu chứng tỏ được là có đủ interest, sẽ được mời tham gia. Trong lúc chờ đợi, xin xem demo ở Youtube để lấy khí thế.

  8. #18
    Tham gia
    12-02-2007
    Location
    HCM - NT
    Bài viết
    218
    Like
    0
    Thanked 1 Time in 1 Post
    Quote Được gửi bởi khopanh View Post
    Thank kiu. Nhưng vấn đề là nó xử lý rất chậm. Sao cái thằng phootoshop hoặc bất kì thằng nào khác như View ảnh của Win, Paint... thực hiện thu phóng chẳng thấy tốn ram gì cả mà lại rất nhanh.
    Mình nản quá vì bế tắc
    Nguyên nhân là các chương trình này khi chạy có sự hỗ trợ trực tiếp của CARD ĐỒ HỌA. chứ không phải gián tiếp như chtr của bạn. Cái chậm của bạn có lẽ là do giai đoạn vẽ.

    Nếu bạn để ý khi cài Windows XP lên mà chưa cài Driver CARD đồ họa (có thể Windows vẫn hỗ trợ tới 32bit màu). Lúc này bạn hãy xem 1 vài bức ảnh chừng 800x600 bằng chương trình ImgView của Windows. Nó cũng bị như bạn đó. Rất chậm và giật.

    Xử lý đồ họa thì bạn chỉ thực hiện trên bộ nhớ mà thôi. 20MB cấp phát không có gì là lâu và đó là giai đoạn bạn LOAD hình vào bộ nhớ. Quan trọng là phải giải mã được các file đồ họa này.

    Còn sau đó muốn xử lý hiệu ứng thì chỉ làm trên buffer. Ví dụ 32bit là 1 pixel muốn hoán đổi pixel thì chỉ dịch chuyển, copy trên bộ nhớ này.. Quan trọng là các thuật toán này phải tối ưu. Còn vấn đề vẽ thì không thể Set từng Pixel ra màn hình được. Cho dù bạn có dùng 2 vùng đệm hoán đổi của GDI cũng rất chậm bởi vì nó là sự xử lý của CPU khi vẽ.

    Muốn thể hiện phong to và thu nhỏ mà không chậm. Bạn có thể vận dụng các thư viện đồ họa cao cấp như OpenGL hay DirectX bởi vì nó là những thư viện tác động trực tiếp với Card đồ họa và công việc này sẽ do GPU (trong card đồ họa đản nhiệm).

    Như vậy xử lý ảnh thì bạn làm trên Buffer. Còn vấn đề vẽ ra làm sao?
    Bạn chỉ cần đưa nội dung của file ảnh (bắt buộc phải giải mã thành dạng *.tag không nén để đưa vào bộ nhớ Card Màn hình) và bạn sử dụng các hàm của OpenGL hoặc DirectX để thực hiện điều đó. Do đó nó sẽ mất bộ nhớ RAM của Driver Card chứ không phải RAM của máy tính. Sau đó GPU để đọc các pixel này để đưa lên màn hình. Các phép biến dổi cơ bản như Quay, Tỷ lệ (phóng to, thu nhỏ), Tịnh tiến,... đã được hỗ trợ bởi Card đồ họa, nếu vận dụng những cái này thì sẽ rất tối ưu và tôi bảo đảm với bạn là không hề chậm!

    Có lẽ bạn cần tham khảo thêm công nghệ Texture của 2 lib này.
    Download thử Demo này xem. Có lẽ hởi khó cho bạn vì nó là Visual C++ chứ không phải C++ Builder tuy nhiên 2 thằng này đều có chung OpenGL hay DX

    Chúc bạn thành công.
    Được sửa bởi eXecutive lúc 15:23 ngày 11-10-2007

  9. #19
    Tham gia
    06-10-2007
    Location
    Hà Nội
    Bài viết
    22
    Like
    0
    Thanked 0 Times in 0 Posts

    Lời cảm ơn đến tất cả các bạn

    Thực sự là tôi rất vui vì đã có rất nhiều bạn quan tâm và dành thời gian giải đáp. Tôi cũng đã hiểu hơn phần nào rồi. Tôi sẽ từ từ nghiên cứu các vấn đề này. Mặc nỗi thời gian lại rất eo hẹp và bận rộn nên đúng là chưa có đầu tư sâu, vừa gặp khó khăn đã la toáng lên rồi. hic, hic. Tôi đúng là dốt phải không các bạn. Vấn đề Computer Vision rất hay, tôi cũng đao được 1 số tài liệu về nó, nhưng đúng là để đấy chưa có dịp đọc, sẽ gửi mail để tham gia cái vụ Computer Vision này.
    Một lần nữa cảm ơn các bạn đã chia sẻ CODE, lời khuyên, chỉ ra lỗi lầm.
    Thank kiu ơ gên

  10. #20
    Tham gia
    21-06-2004
    Bài viết
    121
    Like
    0
    Thanked 1 Time in 1 Post
    Quote Được gửi bởi eXecutive View Post
    Nguyên nhân là các chương trình này khi chạy có sự hỗ trợ trực tiếp của CARD ĐỒ HỌA. chứ không phải gián tiếp như chtr của bạn. Cái chậm của bạn có lẽ là do giai đoạn vẽ.

    Nếu bạn để ý khi cài Windows XP lên mà chưa cài Driver CARD đồ họa (có thể Windows vẫn hỗ trợ tới 32bit màu). Lúc này bạn hãy xem 1 vài bức ảnh chừng 800x600 bằng chương trình ImgView của Windows. Nó cũng bị như bạn đó. Rất chậm và giật.

    Xử lý đồ họa thì bạn chỉ thực hiện trên bộ nhớ mà thôi. 20MB cấp phát không có gì là lâu và đó là giai đoạn bạn LOAD hình vào bộ nhớ. Quan trọng là phải giải mã được các file đồ họa này.

    Còn sau đó muốn xử lý hiệu ứng thì chỉ làm trên buffer. Ví dụ 32bit là 1 pixel muốn hoán đổi pixel thì chỉ dịch chuyển, copy trên bộ nhớ này.. Quan trọng là các thuật toán này phải tối ưu. Còn vấn đề vẽ thì không thể Set từng Pixel ra màn hình được. Cho dù bạn có dùng 2 vùng đệm hoán đổi của GDI cũng rất chậm bởi vì nó là sự xử lý của CPU khi vẽ.

    Muốn thể hiện phong to và thu nhỏ mà không chậm. Bạn có thể vận dụng các thư viện đồ họa cao cấp như OpenGL hay DirectX bởi vì nó là những thư viện tác động trực tiếp với Card đồ họa và công việc này sẽ do GPU (trong card đồ họa đản nhiệm).

    Như vậy xử lý ảnh thì bạn làm trên Buffer. Còn vấn đề vẽ ra làm sao?
    Bạn chỉ cần đưa nội dung của file ảnh (bắt buộc phải giải mã thành dạng *.tag không nén để đưa vào bộ nhớ Card Màn hình) và bạn sử dụng các hàm của OpenGL hoặc DirectX để thực hiện điều đó. Do đó nó sẽ mất bộ nhớ RAM của Driver Card chứ không phải RAM của máy tính. Sau đó GPU để đọc các pixel này để đưa lên màn hình. Các phép biến dổi cơ bản như Quay, Tỷ lệ (phóng to, thu nhỏ), Tịnh tiến,... đã được hỗ trợ bởi Card đồ họa, nếu vận dụng những cái này thì sẽ rất tối ưu và tôi bảo đảm với bạn là không hề chậm!

    Có lẽ bạn cần tham khảo thêm công nghệ Texture của 2 lib này.
    Download thử Demo này xem. Có lẽ hởi khó cho bạn vì nó là Visual C++ chứ không phải C++ Builder tuy nhiên 2 thằng này đều có chung OpenGL hay DX

    Chúc bạn thành công.
    eXecutive có biết thực sự 1 chương trình xử lý ảnh như PS chạy thế nào không mà lôi cả Driver Card đồ họa với cả DirectX vào đây. Tôi nghĩ bạn nên học hỏi thật nhiều đã trước khi muốn truyền kiến thức cho người khác. Nếu không Nhiệt tình + *** = Phá hoại đấy.

Trang 2 / 6 FirstFirst 12345 ... LastLast

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •