반도체

반도체 8대 공정 중 마지막 package 공정을 후공정이라 한다.

단어 선택

  • 1번
    • Back End Process of: 반도체 후공정 패키징 과정 전체
    • Post-processing stage: 그 과정이 완료된 후에 이루어지는 후속 처리
  • 2번
    • Consequently: 공식적, 필연적
    • As a result: 예상외의 것
  • 3-1번
    • Required: 법률, 규정, 지침 등의 명확한 규제 또는 기준에 의해 요구되는 경우
    • Necessary: 논리적, 실직적, 사실적으로 필요한 상황일 경우
  • 3-2번
    • the user must manually input the new parameters: 강한 필수성
      • 기계에 전달되는 방식이 여러 가지일 수 있는 상황에서
    • the user must enter the new parameters manually: 강한 필수성
      • 키보드나 터치스크린 등을 통해 데이터를 직접적으로 시스템에 제공하는 행위에서
  • 4번
    • Accordingly: 제시된 정보나 상황에 따라 적절한 대응을 강조
    • In response: 특정한 요청이나 변화에 따른 행동이나 의견
    • Therefore: 논리적인 결론을 도출할 때 사용
  • 5번
    • we propose a new semiconductor defect detection user interface that minimizes user parameter input and can flexibly respond to material changes: 능동태(일반 적인 글쓰기)
    • A new semiconductor defect detection user interface capable of minimizing user parameter input and flexibly responding to material change is proposed: 수동태(과학적 논문이나 공식적인 보고서에서 많이 사용)
  • 6번
    • "to incorporate various insights from actual field experts through user requirement analysis”: 왜 재구성 되었는가? 현장 전문가들의 통찰력을 결합
    • "by reflecting various opinions of actual field experts through analysis of user needs": 왜 재구성 되었는가? 현장 전문가들의 의견이 인터페이스에 반영하다. (빈약)
  • 7번
    • "The user interface developed through this design allows efficient task performance even when new material changes or new field experts are introduced due to its fewer user inputs and intuitive logical flow.": 직접적인 주장
      • allows: 가능성이나 기회를 제공
    • "This user interface, developed through this design process, ensures efficient task performance, even when new material changes or new field experts are introduced, by applying less user input and an intuitive logical flow.": 개발 과정 강조
      • ensures: 강력한 결과를 보장
    • "The user interface developed through this design applies less user input and an intuitive logical flow to efficiently perform tasks even when new changes in materials or new field experts are introduced.": 어떻게 효과적으로 작업을 수행하는지 초점
  • 9번
    • "Looking ahead, the user interface proposed in this study is flexibly designed to enable continuous improvements by introducing more user-friendly elements, including voice recognition and chatbot functionalities.": 앞을 내다보는 느낌으로 연속적인 개선을 가능하게 하는 유연한 디자인으로 만들어졌다는 것을 강조
    • "In this study, the proposed user interface is flexibly designed to perform continuous improvement by introducing more user-friendly elements based on voice recognition and chatbot in the future.": 지속적인 개선을 강조
    • "The user interface proposed in this study is flexibly designed to enable continuous improvements by introducing more user-friendly elements based on voice recognition and chatbot in the future.": 첫 번째와 세 번째 문장의 혼합입니다. 첫 번째 문장과 같이 유연한 디자인과 연속적인 개선을 가능하게 하는 능력을 강조

 

작성에 도움을 받은 글

https://blog.essayreview.co.kr/academic/common-transition-terms-used-in-academic-papers/

'Project > Vision Inspection GUI' 카테고리의 다른 글

C# OpenCVSharp4 Troble Shooting  (0) 2023.07.23
C# 클래스 -> 구조체 변경 Troble Shooting  (0) 2023.07.19

상황

일하고 있는 곳 에서 반도체 불량 부분을 OpenCvSharp4 라이브러리를 사용하여 표시하는 일을 맡게 되었다.

OpenCvSharp4 라이브러리의 Circle, Rectangle 함수를 사용하여 이미지를 그리는 코드를 작성하였는데 회색조 이미지에는 색상 표기가 되는 반면 윈도우 화면을 캡쳐 하여 만들어둔 일반적인 이미지에서는 검은색으로만 표시가 되는 문제가 발생하였다.

 

추측 

처음에는 이미지를 그리기 전에 OpenCV에서 색상을 나타내는 방식(B,G,R)과 .NET에서 색상을 나타내는 방식(R,G,B)이 다르기 때문에 이러한 문제가 발생한 것이라 생각을 하여 변환하는 코드를 작성하였으나  

        private static Scalar ToScalar(Color color)
        {
            return new Scalar( color.B, color.G, color.R);
        }

해당 코드를 사용했음에도 문제가 해결이 되지 않아 고심하던 중

이미지의 속성에 차이가 있지 않을까? 라는 생각이 문득 들게 되었고 

정답이었다. 

색상이 잘 표시되는 이미지의 비트수준은 24비트 흔이 알고 있는 (RGB)형식이었고 3채널

색상이 표시되지 않는 이미지의 비트수준은 32비트 (RGB+투명도A)형식이었다 4채널

해결

따라서 이미지를 그리기 전에 OpenCVSharp4의 라이브러리를 사용하여 이미지 타입을 24비트로 변환하여 작업을 하니 문제를 해결 할 수 있었다.

            if (Img.Channels() == 4)
            {
                Img = Img.CvtColor(ColorConversionCodes.BGRA2BGR);
            }

'Project > Vision Inspection GUI' 카테고리의 다른 글

논문 초록 작성 고민  (1) 2023.07.31
C# 클래스 -> 구조체 변경 Troble Shooting  (0) 2023.07.19

상황

일하고 있는 곳 에서 반도체 불량 검출 GUI제작 프로젝트를 진행하던 중 C#에서 검사에 사용하기로 한 파라미터들의 정보를 저장 해둔 클래스를 구조체로 바꾸어서 작업을 해야 하기로 이야기가 나오게 되었고  

클래스 -> 구조체로 바꾸는 작업을 다른 팀원이 하고 프로그램을 돌려본 결과 기존에 마우스 조작 이벤트로 잘 그려지던 (Roi)관심 영역 바운딩 박스가 그려지지 않는다는 이슈사항이 발생하였다.

 

<기능이 제대로 수행되는 상황>

<클래스 -> 구조체 이슈 이후>

처음에 마우스 클릭으로 좌표가 잡히긴 하지만 드레그 이벤트가 아예 동작하지 않았다.

 

또 내가 코드를 어디 잘 못 짰겠구나 싶어 디버깅 하며 원인을 찾던 중 로직에서 문제가 될 것 이라 추정되는 부분을 찾을 수 있었다.

<문제가 일어난 걸로 추측되는 코드>

        private void UpdateRoi(MouseEventArgs e, List<Roi> roiList, List<Roi> calibratedRoiList)
        {
            if (roiList.Count == 0) return;

            int mouseX = Math.Min(e.X, PictureBox.Width);
            int mouseY = Math.Min(e.Y, PictureBox.Height);

            Roi lastRoi = roiList[roiList.Count - 1];
            Roi lastCalibratedRoi = calibratedRoiList[calibratedRoiList.Count - 1];

            lastCalibratedRoi.Width = (int)(mouseX * WidthRatio) - lastCalibratedRoi.TopLeft.X;
            lastCalibratedRoi.Height = (int)(mouseY * HeightRatio) - lastCalibratedRoi.TopLeft.Y;

            lastRoi.Width = mouseX - lastRoi.TopLeft.X;
            lastRoi.Height = mouseY - lastRoi.TopLeft.Y;

        }

로직 자체는 빈틈이 없다 생각되어 C#의 구조체와 클래스의 어떠한 차이로 발생한 이슈가 아닌가 추측이 들었고,

해당 내용을 공부하니 원인을 찾을 수 있었다.

그림 출처: https://woozzang.tistory.com/29

즉 위에 그림기준으로 생각하면 원래 아래 존재하는 코드는 Heap 메모리의 주소를 받아 사용하여 값이 바뀌게되면 Call By Reference 참조의 의한 호출이기 때문에 실제 값 또한 바뀌었을 것 인대

Roi lastRoi = roiList[roiList.Count - 1];
Roi lastCalibratedRoi = calibratedRoiList[calibratedRoiList.Count - 1];

구조체로 바뀌게 되어 Stack 영역에는 실제 값이 저장되게 되어 Call By Value 값의 의한 호출이 되어 해당 값을 바뀌더라도 원본의 값이 변경되지 않게 되었다.

 

즉 List에 C# 클래스가 저장될 때는 참조를 저장하기 때문에 위에 코드에서 참조된 값을 수정하여도 아무 문제가 일어나지 않지만

C# 구조체가 저장될 때는 참조를 저장하는 것이 아닌 값을 저장하는 것이기 때문에 이러한 문제가 발생한 것 이었다.

<수정된 코드>

값을 직접 바꾸어 주도록 로직을 수정하였다.

        private void UpdateRoi(MouseEventArgs e, List<Roi> roiList, List<Roi> calibratedRoiList)
        {
            if (roiList.Count == 0) return;

            int mouseX = Math.Min(e.X, PictureBox.Width);
            int mouseY = Math.Min(e.Y, PictureBox.Height);

            Roi lastRoi = roiList[roiList.Count - 1];
            Roi lastCalibratedRoi = calibratedRoiList[calibratedRoiList.Count - 1];

            lastCalibratedRoi.Width = (int)(mouseX * WidthRatio) - lastCalibratedRoi.TopLeft.X;
            lastCalibratedRoi.Height = (int)(mouseY * HeightRatio) - lastCalibratedRoi.TopLeft.Y;

            lastRoi.Width = mouseX - lastRoi.TopLeft.X;
            lastRoi.Height = mouseY - lastRoi.TopLeft.Y;

            roiList[roiList.Count - 1] = lastRoi;
            calibratedRoiList[calibratedRoiList.Count - 1] = lastCalibratedRoi;
        }

'Project > Vision Inspection GUI' 카테고리의 다른 글

논문 초록 작성 고민  (1) 2023.07.31
C# OpenCVSharp4 Troble Shooting  (0) 2023.07.23

+ Recent posts