teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

コード追加

2021/01/22 09:43

投稿

fana
fana

スコア12234

answer CHANGED
@@ -1,3 +1,53 @@
1
1
  (タグに`OpenCV`がついてるので…)
2
2
 
3
- マスクを用意し,`cv::Mat::copyTo`で使う.
3
+ マスクを用意し,`cv::Mat::copyTo`で使う.
4
+
5
+ ---
6
+
7
+ 原理確認のサンプルコードを示す.
8
+
9
+ ```C++
10
+ class TestClass
11
+ {
12
+ public:
13
+ TestClass( int ImgW, int ImgH )
14
+ {
15
+ m_MasterImg = cv::Mat::zeros( ImgH, ImgW, CV_8UC3 );
16
+ m_TempCanvas = cv::Mat::zeros( m_MasterImg.size(), CV_8UC3 );
17
+ m_Mask = cv::Mat( m_MasterImg.size(), CV_8UC1 );
18
+ m_Mask = 255;
19
+ }
20
+
21
+ public:
22
+ const cv::Mat &CurrImg() const { return m_MasterImg; }
23
+
24
+ void DrawCircle( cv::Point Center, int Radius, cv::Scalar Color, int Thickness )
25
+ {
26
+ cv::circle( m_TempCanvas, Center, Radius, Color, Thickness );
27
+ m_TempCanvas.copyTo( m_MasterImg, m_Mask );
28
+ cv::circle( m_Mask, Center, Radius, cv::Scalar(0), Thickness );
29
+ }
30
+
31
+ private:
32
+ cv::Mat m_MasterImg;
33
+ cv::Mat m_Mask;
34
+ cv::Mat m_TempCanvas;
35
+ };
36
+
37
+
38
+ int main()
39
+ {
40
+ TestClass Test( 320, 240 );
41
+ //赤,緑,青 の順で描画
42
+ Test.DrawCircle( cv::Point(100,100), 60, cv::Scalar(0,0,255), -1 );
43
+ Test.DrawCircle( cv::Point(150,120), 50, cv::Scalar(0,255,0), 5 );
44
+ Test.DrawCircle( cv::Point(230,150), 100, cv::Scalar(255,32,32), 8 );
45
+
46
+ cv::imshow( "Result", Test.CurrImg() );
47
+ if( cv::waitKey() == 's' ){ cv::imwrite( "Result.png", Test.CurrImg() ); }
48
+ return 0;
49
+ }
50
+ ```
51
+
52
+ 結果:
53
+ ![イメージ説明](f211005c75e938cf40fbfd8683d655dd.png)